CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [数据库名.]表名
[(列名 数据类型 [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]
| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]
(Note: only available starting with 0.6.0)]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)] (Note: only available starting with 0.6.0)
参数解释:
[b]EXTERNAL[/b]:是否为外部表(加EXTERNAL为外部表)。
外部表
建表时,可以指定一个指向实际数据的路径(LOCATION)。
删表时,只删除元数据,不删除数据(即不删除HDFS上的数据文件)。
内部表
建表时,会将数据移动到数据仓库指向的路径。
删表时,只删除元数据和数据文件一起删除。
[b]IF NOT EXISTS[/b]:是否检查表已存在。
加上IF NOT EXISTS,表存在时不做任何操作,返回true。
不加,表存在时报错。
[b]COMMENT[/b]:添加注释。
[b]PARTITIONED BY[/b]:分区。
查询时,有时候只需扫描表中的一部分数据,无需全表扫描,所以引入的分区。
分区的目的,就是辅助查询,缩小查询范围,加快数据的检索速度和对数据按照一定的规格和条件进行管理。
一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。
分区是以字段的形式在表结构中存在,但是该字段不存放实际的数据内容,仅仅是分区的表示。通过describe table命令可以查看到字段存在。
[b]CLUSTERED BY[/b]:群集(桶)。
CLUSTERED是在分区的基础上,按照列,对数据的进一步拆分和归类。
表和分区都可以对列进行 CLUSTERED BY 操作,将若干个列放入一个桶(bucket)中。
bucket的主要作用:
① 数据抽样。
② 提升某些查询操作效率,例如mapside join。
也可以利用SORT BY 对数据进行排序。这样可以为特定应用提高性能。
[b]ROW FORMAT[/b]:设置列分隔符。
row_format支持格式
① DELIMITED [FIELDS TERMINATED BY char]
② DELIMITED [COLLECTION ITEMS TERMINATED BY char]
③ DELIMITED [MAP KEYS TERMINATED BY char]
④ SERDE serde_name [WITH SERDEPROPERTIES property_name=property_value,property_name=property_value, ...]
[b]STORED AS[/b]:设置加载数据的数据类型。
TEXTFILE表示纯文本文件(默认)。
SEQUENCE表示压缩文件。
[b]LOCATION[/b]:实际数据的路径。
[(列名 数据类型 [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]
| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]
(Note: only available starting with 0.6.0)]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)] (Note: only available starting with 0.6.0)
参数解释:
[b]EXTERNAL[/b]:是否为外部表(加EXTERNAL为外部表)。
外部表
建表时,可以指定一个指向实际数据的路径(LOCATION)。
删表时,只删除元数据,不删除数据(即不删除HDFS上的数据文件)。
内部表
建表时,会将数据移动到数据仓库指向的路径。
删表时,只删除元数据和数据文件一起删除。
[b]IF NOT EXISTS[/b]:是否检查表已存在。
加上IF NOT EXISTS,表存在时不做任何操作,返回true。
不加,表存在时报错。
[b]COMMENT[/b]:添加注释。
[b]PARTITIONED BY[/b]:分区。
查询时,有时候只需扫描表中的一部分数据,无需全表扫描,所以引入的分区。
分区的目的,就是辅助查询,缩小查询范围,加快数据的检索速度和对数据按照一定的规格和条件进行管理。
一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。
分区是以字段的形式在表结构中存在,但是该字段不存放实际的数据内容,仅仅是分区的表示。通过describe table命令可以查看到字段存在。
[b]CLUSTERED BY[/b]:群集(桶)。
CLUSTERED是在分区的基础上,按照列,对数据的进一步拆分和归类。
表和分区都可以对列进行 CLUSTERED BY 操作,将若干个列放入一个桶(bucket)中。
bucket的主要作用:
① 数据抽样。
② 提升某些查询操作效率,例如mapside join。
也可以利用SORT BY 对数据进行排序。这样可以为特定应用提高性能。
[b]ROW FORMAT[/b]:设置列分隔符。
row_format支持格式
① DELIMITED [FIELDS TERMINATED BY char]
② DELIMITED [COLLECTION ITEMS TERMINATED BY char]
③ DELIMITED [MAP KEYS TERMINATED BY char]
④ SERDE serde_name [WITH SERDEPROPERTIES property_name=property_value,property_name=property_value, ...]
[b]STORED AS[/b]:设置加载数据的数据类型。
TEXTFILE表示纯文本文件(默认)。
SEQUENCE表示压缩文件。
[b]LOCATION[/b]:实际数据的路径。