更新时间:2022-02-22 GMT+08:00

使用Hive语法创建DLI表

功能描述

使用Hive语法创建DLI表。DataSource语法和Hive语法主要区别在于支持的表数据存储格式范围、支持的分区数等有差异,详细请参考语法格式和注意事项说明。

语法格式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name 
  [(col_name1 col_type1 [COMMENT col_comment1], ...)]
  [COMMENT table_comment] 
  [PARTITIONED BY (col_name2 col_type2, [COMMENT col_comment2], ...)] 
  [ROW FORMAT row_format]
  STORED AS file_format 
  [TBLPROPERTIES (key1=val1, key2=val2, ...)]
  [AS select_statement];

row_format:
  : SERDE serde_cls [WITH SERDEPROPERTIES (key1=val1, key2=val2, ...)]
  | DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]]
      [COLLECTION ITEMS TERMINATED BY char]
      [MAP KEYS TERMINATED BY char]
      [LINES TERMINATED BY char]
      [NULL DEFINED AS char]

关键字

  • IF NOT EXISTS:指定该关键字以避免表已经存在时报错。
  • COMMENT:字段或表描述。
  • PARTITIONED BY:指定分区字段。
  • ROW FORMAT:行数据格式。
  • STORED AS:指定所存储的文件格式,当前该关键字只支持指定TEXTFILE, AVRO, ORC, SEQUENCEFILE, RCFILE, PARQUET, CARBON几种格式。创建DLI表时必须指定此关键字。
  • TBLPROPERTIES:TBLPROPERTIES子句允许用户给表添加key/value的属性。
  • AS:使用CTAS创建表。

参数说明

表1 参数描述

参数

描述

db_name

Database名称,由字母、数字和下划线(_)组成。不能是纯数字,且不能以数字和下划线开头。

table_name

Database中的表名,由字母、数字和下划线(_)组成。不能是纯数字,且不能以数字和下划线开头。匹配规则为:^(?!_)(?![0-9]+$)[A-Za-z0-9_$]*$。如果特殊字符需要使用单引号('')包围起来。

col_name

以逗号分隔的带数据类型的列名。列名由字母、数字和下划线(_)组成。不能是纯数字,且至少包含一个字母。

col_type

字段类型。

col_comment

字段描述。

row_format

行数据格式。

file_format

DLI表数据存储格式:支持TEXTFILE, AVRO, ORC, SEQUENCEFILE, RCFILE, PARQUET, CARBON。

table_comment

表描述。

select_statement

用于CTAS命令,将源表的select查询结果或某条数据插入到新创建的DLI表中。

注意事项

  • 创建分区表时,PARTITONED BY中指定分区列必须是不在表中的列,且需要指定数据类型。分区列支持string, boolean, tinyint, smallint, short, int, bigint, long, decimal, float, double, date, timestamp等hive开源支持的类型。
  • 支持指定多个分区字段,分区字段只需在PARTITIONED BY关键字后指定,不能像普通字段一样在表名后指定,否则将出错。
  • 单表分区数最多允许100000个。
  • CTAS建表语句不能指定表的属性,不支持创建分区表。

示例

  • 创建一张名为src的表,该表包含字段key、value,其对应的数据类型分别是INT、STRING,并可根据需要指定属性。
    1
    2
    3
    4
    CREATE TABLE src
      (key INT, value STRING)
      STORED AS PARQUET
      TBLPROPERTIES('key1' = 'value1');
    
  • 以班级号(classNo)为分区字段,创建一张名为student的表,包含姓名(name)与分数(score)两个字段。
    1
    2
    3
    4
    CREATE TABLE student
      (name STRING, score INT)
      STORED AS PARQUET
      TBLPROPERTIES('key1' = 'value1') PARTITIONED BY(classNo INT);
    
  • 创建表t1,并将表t2的数据插入到表t1中。
    1
    2
    3
    CREATE TABLE t1
      STORED AS PARQUET
      AS select * from t2;