创建数据源表

描述

CREATE TABLE 语句使用数据源定义一个新表。

语法

CREATE TABLE [ IF NOT EXISTS ] table_identifier
[ ( col_name1 col_type1 [ COMMENT col_comment1 ], ... ) ]
USING data_source
[ OPTIONS ( key1=val1, key2=val2, ... ) ]
[ PARTITIONED BY ( col_name1, col_name2, ... ) ]
[ CLUSTERED BY ( col_name3, col_name4, ... )
[ SORTED BY ( col_name [ ASC | DESC ], ... ) ]
INTO num_buckets BUCKETS ]
[ LOCATION path ]
[ COMMENT table_comment ]
[ TBLPROPERTIES ( key1=val1, key2=val2, ... ) ]
[ AS select_statement ]

请注意,USING子句和AS SELECT子句之间的条款可以以任何顺序出现。例如,您可以在TBLPROPERTIES之后编写COMMENT table_comment。

参数

数据源交互

数据源表就像指向底层数据源的指针。例如,您可以在 Spark 中创建一个指向 MySQL 中表“bar”的“foo”表,使用 JDBC 数据源。当您读取/写入“foo”表时,实际上是在读取/写入“bar”表。

一般来说,CREATE TABLE是在创建一个“指针”,你需要确保它指向某个现有的事物。一个例外是像parquet、json这样的文件源。如果你不指定LOCATION,Spark会为你创建一个默认的表位置。

对于带有 LOCATION 的 CREATE TABLE AS SELECT,如果给定的位置作为非空目录存在,Spark 会抛出分析异常。如果 spark.sql.legacy.allowNonEmptyLocationInCTAS 设置为 true,Spark 将用输入查询的数据覆盖基础数据源,以确保创建的表与输入查询包含完全相同的数据。

示例


--使用数据源
CREATE TABLE student (id INT, name STRING, age INT) USING CSV;
--从另一个表中使用数据
CREATE TABLE student_copy USING CSV
AS SELECT * FROM student;
--省略 USING 子句,使用默认数据源(默认是 parquet)
CREATE TABLE student (id INT, name STRING, age INT);
--使用 parquet 数据源和 parquet 存储选项
--“id”和“name”列在写入 parquet 文件时启用布隆过滤器,
--“age”列未启用
CREATE TABLE student_parquet(id INT, name STRING, age INT) USING PARQUET
OPTIONS (
'parquet.bloom.filter.enabled'=,
'parquet.bloom.filter.enabled#age'=);
--指定表的注释和属性
CREATE TABLE student (id INT, name STRING, age INT) USING CSV
COMMENT TBLPROPERTIES (=);
--使用不同的子句顺序指定表的注释和属性
CREATE TABLE student (id INT, name STRING, age INT) USING CSV
TBLPROPERTIES (=)
COMMENT ;
--创建分区和桶存储的表
CREATE TABLE student (id INT, name STRING, age INT)
USING CSV
PARTITIONED BY (age)
CLUSTERED BY (Id) INTO 4 ;
--通过 CTAS 创建分区和桶存储的表
CREATE TABLE student_partition_bucket
USING parquet
PARTITIONED BY (age)
CLUSTERED BY (id) INTO 4 
AS SELECT * FROM student;
--通过 CTAS 和 CTE 创建桶存储的表
CREATE TABLE student_bucket
USING parquet
CLUSTERED BY (id) INTO 4  (
WITH tmpTable AS (
SELECT * FROM student WHERE id > 100
)
SELECT * FROM tmpTable
);