Hive建表语句详解

发布于:2024-12-22 ⋅ 阅读:(9) ⋅ 点赞:(0)
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]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]
[TBLPROPERTIES (property_name=property_value, ...)]

(1)TEMPORARY

创建临时表,会话结束表会被删除

(2)EXTERNAL

创建外部表,不加创建内部表,关于两者区别具体见: Hive内部表和外部表的区别-CSDN博客

(3) PARTITION BY

创建分区表。分区表就是把一张大表的数据分散存储到多个目录下,这样在查询时就能够通过添加where子句选择所要查询的分区,提高查询效率。实际生产中常见的是按照日期进行分区。

create table dept_partition (

    deptno int,
    deptname string,
    loc string
)
partition by (day string)
row format delimited fields terminated by '\t';

(4)ClUSTERED BY ... [SORTED BY ... ]INTO ... BUCKETS

创建分桶表。分桶表针对的是数据文件。其基本原理是:依据指定字段为每行数据计算一个hash值,然后让这个hash值对分桶数取模,取模结果相同的写入一个桶。

添加sorted by关键字,创建分桶排序表。

(5) ROW FORMAT

在进行数据的持久化存盘和网络传输时,需要对数据进行序列化处理,也就是将内存中的对象转换为字节码序列;反序列化就是将字节码序列转换为内存中的对象。hive是分布式框架,涉及到不同节点之间的网络传输,需要为数据指定序列化和反序列化方法,即指定SERDE(Serializer 和 Deserializer)。具体有以下两种语法:

①  row format delimited

delimited关键字表示对文件中的每个字段按照指定分隔符进行分割,其会使用默认的SERDE对每行数据进行序列化和反序列化。

row format delimited
[fields terminated by char]    # 用来指定列分隔符
[collection items terminated bt char]  # map\struct\array中每个元素之间的分隔符
[map keys terminated by]  # map 的key与value之间的分隔符
[lines terminated by char]  # 行分隔符
[null defined as char]

② row format serde

serde关键字显示指定所需要使用的serde

row format serde serde_name 
[with serdeproperties (property_name=property_value,property_name=property_value,...)]

如在使用flume将数据从Kafka读取到hdfs上时,读取的数据是json格式,则不同通过delimited关键字指定分隔符,此时需要用serde关键字,告诉hive数据格式, hive才能正确解析。

row format serde 'org.apache.hadoop.hive.serde2.JsonSerDe'

(6)STORED AS

指定数据文件格式,常见的文件格式有:textfile(默认)、orc、parquet、sequence等

(7)LOCATION 

        指定表格数据所在的hdfs路径,不写则默认在/user/hive/warehouse/db_name.bd/table_name路径下。可以任意指定,然后通过load将数据装载过来。

(8)TBLPROPERTIES

用于配置表的一些kv键值对参数。