在项目开发中,一般数据库都会创建好,或者创建好后后面不需要进行改动。 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