创建数据源表
描述
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。
参数
-
table_identifier
指定表名,可以选择使用数据库名称进行限定。
语法:
[ database_name. ] table_name
-
USING data_source
数据源是用于创建表的输入格式。数据源可以是 CSV、TXT、ORC、JDBC、PARQUET 等。
-
OPTIONS
将注入到存储属性的数据源选项。
-
PARTITIONED BY
根据指定的列在表上创建分区。
-
CLUSTERED BY
将在表上创建的分区根据为分桶指定的列分桶到固定桶中。
注意:分桶是一种优化技术,它使用桶(和分桶列)来确定数据分区并避免数据混洗。
-
SORTED BY
指定桶列的排序顺序。可选地,可以在 SORTED BY 子句中的任何列名之后使用 ASC 表示升序,或使用 DESC 表示降序。如果未指定,则默认情况下假定为 ASC。
-
INTO num_buckets BUCKETS
指定桶数,用于
CLUSTERED BY
子句。 -
LOCATION
存储表数据的目录的路径,可以是分布式存储(如 HDFS 等)上的路径。
-
COMMENT
用于描述表的字符串字面量。
-
TBLPROPERTIES
用于标记表定义的键值对列表。
-
AS select_statement
使用 select 语句中的数据填充表。
数据源交互
数据源表的作用类似于指向基础数据源的指针。例如,您可以使用 JDBC 数据源在 Spark 中创建一个指向 MySQL 中的表“bar”的表“foo”。当您读取/写入表“foo”时,您实际上是在读取/写入表“bar”。
通常,CREATE TABLE 创建一个“指针”,您需要确保它指向现有内容。文件源(如 parquet、json)除外。如果您未指定 LOCATION,Spark 将为您创建一个默认表位置。
对于带有 LOCATION 的 CREATE TABLE AS SELECT,如果给定位置存在且为非空目录,则 Spark 会抛出分析异常。如果将 spark.sql.legacy.allowNonEmptyLocationInCTAS
设置为 true,Spark 会使用输入查询的数据覆盖基础数据源,以确保创建的表包含与输入查询完全相同的数据。
示例
--Use data source
CREATE TABLE student (id INT, name STRING, age INT) USING CSV;
--Use data from another table
CREATE TABLE student_copy USING CSV
AS SELECT * FROM student;
--Omit the USING clause, which uses the default data source (parquet by default)
CREATE TABLE student (id INT, name STRING, age INT);
--Use parquet data source with parquet storage options
--The columns 'id' and 'name' enable the bloom filter during writing parquet file,
--column 'age' does not enable
CREATE TABLE student_parquet(id INT, name STRING, age INT) USING PARQUET
OPTIONS (
'parquet.bloom.filter.enabled'='true',
'parquet.bloom.filter.enabled#age'='false'
);
--Specify table comment and properties
CREATE TABLE student (id INT, name STRING, age INT) USING CSV
COMMENT 'this is a comment'
TBLPROPERTIES ('foo'='bar');
--Specify table comment and properties with different clauses order
CREATE TABLE student (id INT, name STRING, age INT) USING CSV
TBLPROPERTIES ('foo'='bar')
COMMENT 'this is a comment';
--Create partitioned and bucketed table
CREATE TABLE student (id INT, name STRING, age INT)
USING CSV
PARTITIONED BY (age)
CLUSTERED BY (Id) INTO 4 buckets;
--Create partitioned and bucketed table through CTAS
CREATE TABLE student_partition_bucket
USING parquet
PARTITIONED BY (age)
CLUSTERED BY (id) INTO 4 buckets
AS SELECT * FROM student;
--Create bucketed table through CTAS and CTE
CREATE TABLE student_bucket
USING parquet
CLUSTERED BY (id) INTO 4 buckets (
WITH tmpTable AS (
SELECT * FROM student WHERE id > 100
)
SELECT * FROM tmpTable
);