DDL中的建表语句通用语法整理
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] row format delimited fields terminated by “分隔符”
[STORED AS file_format]
[LOCATION hdfs_path]
[LIKE]
(1)CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。
(2)EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive创建内部表时,
会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。
在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
因为表是外部表,所以Hive并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。
(管理表和外部表的使用场景
每天将收集到的网站日志定期流入HDFS文本文件。
在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过SELECT+INSERT进入内部表。)
1)所有数据处理,全部由hive完成,适合用内部表
2)有hive和其他工具共同处理一个数据集即同一数据集有多个应用要处理,适合用外部表
3)从hive中导出数据,供其他应用使用,适合用外部表
4)普遍用法:初始数据集由外部表操作,数据分析中间表使用内部表
(3)COMMENT:为表和列添加注释。
(3)PARTITIONED BY创建分区表
(4)CLUSTERED BY创建分桶表
(5)SORTED BY不常用
(7)ROW FORMAT DELIMITED
[FIELDS TERMINATED BY char] 字段之间的分割符号
[COLLECTION ITEMS TERMINATED BY char] Map Struct Array 这些集合中元素之间的分割符号
[MAP KEYS TERMINATED BY char] Map中key和value的分割符号
[LINES TERMINATED BY char] 行之间的分隔符号
|
SERDE ‘serde_class_name’ [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
用户在建表的时候可以自定义SerDe或者使用HIVE自带的SerDe。
如果没有指定ROW FORMAT 或者ROW FORMAT DELIMITED,将会使用自带的SerDe。在建表的时候,用户还需要为表指定列,
用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。
SerDe是Serialize/Deserilize的简称,目的是用于序列化和反序列化。
(8)STORED AS指定存储文件类型
常用的存储文件类型:
SEQUENCEFILE(hadoop_kv序列文件)、
TEXTFILE(文本)、
RCFILE(列式存储格式文件)、
PARQUETFILE(列式存储文件)
如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。
(9)LOCATION :指定表在HDFS上的存储位置。
(10)LIKE允许用户复制现有的表结构,但是不复制数据。