CREATE DATASOURCE TABLE
説明
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 データソースを使用して、MySQL のテーブル "bar" を指す Spark にテーブル "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
);