在项目开发中,一般数据库都会创建好,或者创建好后后面不需要进行改动。 Hive建表才是是学习使用hive的第一步,然后才能基于表对hive数据仓库进行操作。学习建表前,首先要知道hive表的构建属性 ,知道哪些属性是固定的,哪些属性是可以定制的等等。
1、创建表
方式一:
官方标准语法:(hql不区分大小写,下面[]里的属性是可选属性)
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY(col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...)
[SORTED BY(col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
【参数说明】
CREATE TABLE :
用于创建一个指定名字的表, 如果相同名字的表已经存在,则抛出异常。用户可以用IF NOT EXIST 选项来忽略这个异常。
EXTERNAL
:EXTERNAL关键字可以让用户创建一个外部表,默认是内部表,外部表在建表的必须同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
COMMENT :
COMMENT 后面跟的字符串是给表字段或者表内容添加注释说明的,虽然它对于表之间的计算没有影响,但是为了后期的维护,所以实际开发都是必须要加COMMENT的。
PARTITIONED BY:PARTITIONED BY
其实是给表做分区,决定了表是否是分区表。Hive中所谓分区表就是将表里新增加一个字段,就是分区的名字,这样你在操作表中的数据时,可以按分区字段进行过滤。
[ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ]
这里指定表存储中国列的划分格式,默认是\001,这里指定的是逗号分隔符,还可以指定其他列的分隔符,看实际需求。
CLUSTERED BY
对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
STORED AS :
如果文件数据是纯文本,则使用STORED AS TEXTFILE ;如果数据 需要压缩, 则使用STORED AS SEQUENCE 。
总结:
实际建表可能会对文件的行列分隔符要求自定义,文件的存储方式有所要求 ,表的分区要求是自动分区,表的存储位置要放到指定路径下等等各种不确定需求,建立的表也是定制化的五花八门,但是核心都在这些基础的建表标准语法里进行变动,变动不同模块实现不同需求。
方式二:
用户还可以通过复制现有表的方式来创建表(数据不会被复制,复制的仅仅是表结构,
也就是创建一个空表)。
LIKE :允许用户复制现有的表结构,但是不复制数据。
hive> CREATE TABLE empty key value store
LIKE key value store;
方式三:
另外,还可以通过CREATE TABLE AS SELECT 的方式来创建表
CREATE TABLE 表名 AS SELECT * from table1
补充:案例
-- 1.建立一个列分隔符为‘,’的表,默认内部表
create table if not exists track(
id int comment'id',
ipname string comment'ip名称',
zart decimal(10,5) comment'测试小数')
partitioned by (date string,hour string)
row format delimited fields terminated by '\t';
2、查看表结构和建表语句
使用desc 表名
可以查看表结构,
使用describe formatted 表名
可以查看表的详细结构
使用show create talbe 表名
可以查看建表语句。
2、修改表_Alter Table
alter table 语法允许改变列名、数据类型、注释、列位置或者它们的任意组合
-- 修改表名
ALTER TABLE name RENAME TO new_name
-- 添加新列名
--方式一:不带注释
ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...]);
-- 方式二:(带注释)
ALTER TABLE pokes ADD COLUMNS (new col INT COMMENT 'new col comment');
--删除列
ALTER TABLE name DROP [COLUMN] column_name
-- 修改已有列的数据类型
-- 方式一:不带注释
ALTER TABLE name CHANGE column_name new_name new_type
--方式二:带注释
ALTER TABLE test_table CHANGE col1 col2 STRING COMMENT 'The datatype of col2 is STRING' AFTER col3;
--更新列
ALTER TABLE name REPLACE COLUMNS (col_spec[, col_spec ...])
【注意】ADD COLUMNS
允许用户在当前列的末尾,分区列之前添加新的列,REPLACE COLUMNS
允许用户更新列,更新的过程是先删除当前的列,然后在加入新的列。
3、删除表
a.删除表数据和元数据
DROP TABLE 语句用于删除表的数据和元数据。对于外部表,只删除Metastore 中的元数据,而外部数据保存不动,示例如下:
drop table my table;
b.删除元数据保留表结构
如果只想删除表数据,保留表结构,跟MySQL 类似,使用TRUNCATE 语句:
TRUNCATE TABLE my table;
4、插入表
a.向表中加载数据
LOAD DATA [LOCAL )INPATH ’ filepath ’[ OVERWRITE) INTO TABLE tablenarne [PARTI TION
( partcoll=vall, partcol2=val2 ... ) ) ·
Load 操作只是单纯的复制/移动操作,将数据文件移动到Hive 表对应的位置。filep ath可以是相对路径,例如project/data I ,也可以是绝对路径,例如/user/hive/project/data 1 ,或是包含模式的完整URI ,
例如hdfs ://namenode: 9000/user /hive/project/data 1 。
b.向查询结果中插入表
将查询结果写入HDFS 文件系统。
1 )基本模式:
INSERT OVERWRITE TABLE tablenarnel [PARTITION (partcoll=vall, partcol2=val2 . .. )]
select statement! FROM from statement
2 )多插入模式:
INSERT OVERWRITE TABLE tablenarnel
[PARTITION (partcoll=vall, partcol2=val2 .•. )] select_statementl
[INSERT OVERWRITE TABLE tablenarne2 [PARTITION ••• ]
select_statement2]
3 )自动分区模式:
INSERT OVERWRITE TABLE tablename PARTITION (partcoll[=vall], partcol2[=val2]…)
select statement FROM from statement