共用方式為


Hive格式使用 CREATE TABLE

適用於:選擇了「是」 Databricks Runtime

使用Hive格式定義資料表。

語法

CREATE [ EXTERNAL ] TABLE [ IF NOT EXISTS ] table_identifier
    [ ( col_name1[:] col_type1 [ COMMENT col_comment1 ], ... ) ]
    [ COMMENT table_comment ]
    [ PARTITIONED BY ( col_name2[:] col_type2 [ COMMENT col_comment2 ], ... )
        | ( col_name1, col_name2, ... ) ]
    [ ROW FORMAT row_format ]
    [ STORED AS file_format ]
    [ LOCATION path ]
    [ TBLPROPERTIES ( key1=val1, key2=val2, ... ) ]
    [ AS select_statement ]

row_format:
    : SERDE serde_class [ WITH SERDEPROPERTIES (k1=v1, k2=v2, ... ) ]
    | DELIMITED [ FIELDS TERMINATED BY fields_terminated_char [ ESCAPED BY escaped_char ] ]
        [ COLLECTION ITEMS TERMINATED BY collection_items_terminated_char ]
        [ MAP KEYS TERMINATED BY map_key_terminated_char ]
        [ LINES TERMINATED BY row_terminated_char ]
        [ NULL DEFINED AS null_char ]

欄定義子句與 AS SELECT 子句之間的子句可以以任何順序出現。 例如,您可以在 TBLPROPERTIES 之後撰寫COMMENT table_comment

備註

您必須指定 STORED ASROW FORMAT 條款。 否則,SQL 剖析器會使用 CREATE TABLE [USING] 語法來剖析它,並預設建立 Delta 數據表。

參數

  • table_identifier

    數據表名稱,選擇性地以架構名稱限定。

    語法[schema_name.] table_name

  • EXTERNAL

    使用 LOCATION中提供的路徑來定義數據表。

  • 分割依據

    透過指定的欄分割資料表。

  • 行格式

    使用 SERDE 子句為一個資料表指定自訂的 SerDe。 否則,請使用 DELIMITED 子句來使用原生 SerDe,並指定分隔符、逸出字元、Null 字元等等。

  • SERDE

    指定一個資料表的自訂 SerDe。

  • serde_class

    指定自訂 SerDe 的完整類別名稱。

  • SERDEPROPERTIES

    用來標記 SerDe 定義的索引鍵/值組清單。

  • 分隔

    DELIMITED子句可用來指定原生 SerDe,並指出分隔符號、逸出字元、Null 字元等等。

  • 欄位分隔符號

    用來定義列分隔符。

  • 以...結束的集合項目

    用來定義集合專案分隔符。

  • 映射鍵由...終止

    用來定義對應索引鍵分隔符。

  • 以...結束的行

    用來定義數據列分隔符。

  • 定義為 NULL

    用來定義 NULL 的特定值。

  • 脫逃於

    定義逸出機制。

  • 集合項目以...結束

    定義收集項分隔符。

  • 映射鍵以...結束

    定義映射鍵分隔符號。

  • 列結束於

    定義數據列分隔符。

  • 定義為 NULL

    請定義 NULL 的特定值。

  • 儲存為

    數據表的檔案格式。 可用的格式包括TEXTFILESEQUENCEFILE、、RCFILEORCPARQUETAVRO。 或者,您可以透過 INPUTFORMATOUTPUTFORMAT指定自己的輸入和輸出格式。 只有格式 TEXTFILESEQUENCEFILE、 和 RCFILE 可以搭配 ROW FORMAT SERDE 使用,而且只能 TEXTFILE 搭配 使用 ROW FORMAT DELIMITED

  • 位置

    儲存表格數據的目錄路徑,這可能是分散式儲存上的路徑。

  • 評論

    用於描述表的字串字面值。

  • TBLPROPERTIES

    用來標記數據表定義的索引鍵/值組清單。

  • AS select_statement

    使用 select 語句中的數據填入數據表。

範例

--Use hive format
CREATE TABLE student (id INT, name STRING, age INT) STORED AS ORC;

--Use data from another table
CREATE TABLE student_copy STORED AS ORC
    AS SELECT * FROM student;

--Specify table comment and properties
CREATE TABLE student (id INT, name STRING, age INT)
    COMMENT 'this is a comment'
    STORED AS ORC
    TBLPROPERTIES ('foo'='bar');

--Specify table comment and properties with different clauses order
CREATE TABLE student (id INT, name STRING, age INT)
    STORED AS ORC
    TBLPROPERTIES ('foo'='bar')
    COMMENT 'this is a comment';

--Create partitioned table
CREATE TABLE student (id INT, name STRING)
    PARTITIONED BY (age INT)
    STORED AS ORC;

--Create partitioned table with different clauses order
CREATE TABLE student (id INT, name STRING)
    STORED AS ORC
    PARTITIONED BY (age INT);

--Use Row Format and file format
CREATE TABLE student (id INT, name STRING)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
    STORED AS TEXTFILE;

--Use complex datatype
CREATE EXTERNAL TABLE family(
        name STRING,
        friends ARRAY<STRING>,
        children MAP<STRING, INT>,
        address STRUCT<street: STRING, city: STRING>
    )
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ESCAPED BY '\\'
    COLLECTION ITEMS TERMINATED BY '_'
    MAP KEYS TERMINATED BY ':'
    LINES TERMINATED BY '\n'
    NULL DEFINED AS 'foonull'
    STORED AS TEXTFILE
    LOCATION '/tmp/family/';

--Use predefined custom SerDe
CREATE TABLE avroExample
    ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
    STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
        OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
    TBLPROPERTIES ('avro.schema.literal'='{ "namespace": "org.apache.hive",
        "name": "first_schema",
        "type": "record",
        "fields": [
                { "name":"string1", "type":"string" },
                { "name":"string2", "type":"string" }
            ] }');

--Use personalized custom SerDe(we may need to `ADD JAR xxx.jar` first to ensure we can find the serde_class,
--or you may run into `CLASSNOTFOUND` exception)
ADD JAR /tmp/hive_serde_example.jar;

CREATE EXTERNAL TABLE family (id INT, name STRING)
    ROW FORMAT SERDE 'com.ly.spark.serde.SerDeExample'
    STORED AS INPUTFORMAT 'com.ly.spark.example.serde.io.SerDeExampleInputFormat'
        OUTPUTFORMAT 'com.ly.spark.example.serde.io.SerDeExampleOutputFormat'
    LOCATION '/tmp/family/';