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 を記述することもできます。

パラメータ

データソースの相互作用

データソーステーブルは、基になるデータソースへのポインタのように機能します。たとえば、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
);