CREATE TABLE [USING]
適用対象: Databricks SQL Databricks Runtime
必要に応じてデータ ソースを使用して、マネージドまたは外部のテーブルを定義します。
構文
{ { [CREATE OR] REPLACE TABLE | CREATE [EXTERNAL] TABLE [ IF NOT EXISTS ] }
table_name
[ table_specification ]
[ USING data_source ]
[ table_clauses ]
[ AS query ] }
table_specification
( { column_identifier column_type [ column_properties ] } [, ...]
[ , table_constraint ] [...] )
column_properties
{ NOT NULL |
GENERATED ALWAYS AS ( expr ) |
GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( [ START WITH start ] [ INCREMENT BY step ] ) ] |
DEFAULT default_expression |
COMMENT column_comment |
column_constraint |
MASK clause } [ ... ]
table_clauses
{ OPTIONS clause |
PARTITIONED BY clause |
CLUSTER BY clause |
clustered_by_clause |
LOCATION path [ WITH ( CREDENTIAL credential_name ) ] |
COMMENT table_comment |
TBLPROPERTIES clause |
WITH { ROW FILTER clause } } [...]
clustered_by_clause
{ CLUSTERED BY ( cluster_column [, ...] )
[ SORTED BY ( { sort_column [ ASC | DESC ] } [, ...] ) ]
INTO num_buckets BUCKETS }
パラメーター
REPLACE
指定した場合は、テーブルとその内容が既に存在する場合に置き換えられます。 この句は、Delta Lake のテーブルでのみサポートされます。
REPLACE
ではテーブル履歴が保持されます。注意
Azure Databricks では、Delta Lake のテーブルを削除して再作成するのではなく、
REPLACE
を使用することを強くお勧めします。EXTERNAL
指定すると、外部テーブルが作成されます。 外部テーブルを作成するときは、
LOCATION
句も指定する必要があります。 外部テーブルが削除されても、LOCATION
のファイルは削除されません。IF NOT EXISTS
指定した場合、同じ名前のテーブルが既に存在すると、ステートメントは無視されます。
IF NOT EXISTS
はREPLACE
と共存できません。つまり、CREATE OR REPLACE TABLE IF NOT EXISTS
は許可されません。-
作成されるテーブルの名前。 名前には、 時仕様またはオプション指定を含めてはなりません。 名前が修飾されていない場合、テーブルは現在のスキーマに作成されます。
hive_metastore
で作成されたテーブルには、英数字の ASCII 文字とアンダースコア (INVALID_SCHEMA_OR_RELATION_NAME) のみを含めることができます。 table_specification
この省略可能な句で、列、その型、プロパティ、説明、および列制約の一覧を定義します。
テーブル スキーマで列を定義しない場合は、
AS query
またはLOCATION
のいずれかを指定する必要があります。-
列の一意の名前。
列マッピング プロパティ (
'delta.columnMapping.mode' = 'name'
) がない Delta Lake テーブルの列識別子には、スペースあるいは次の文字 (, ; { } ( ) \n \t =
) を含めてはいけません。AVRO
テーブルの列識別子は、アンダースコア (_
) または Unicode 文字 (非 ASCII 文字を含む) で始まり、その後に Unicode 文字、ディジット、アンダースコアの組み合わせが続く必要があります。 -
列のデータ型を指定します。 Azure Databricks でサポートされているすべてのデータ型が、すべてのデータ ソースでサポートされているわけではありません。
NOT NULL
指定した場合、列は
NULL
値を受け入れません。 この句は、Delta Lake のテーブルでのみサポートされます。GENERATED ALWAYS AS ( expr )
この句を指定すると、この列の値は、指定した
expr
によって決定されます。expr
は、以下のものを除く、リテラル、テーブル内の列識別子、および決定論的な組み込みの SQL 関数または演算子で構成される場合があります。また
expr
には、サブクエリを含めることはできません。GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( [ START WITH start ] [ INCREMENT BY step ] ) ]
適用対象: Databricks SQL Databricks Runtime 10.4 LTS 以降
ID 列を定義します。 テーブルへの書き込み時に ID 列の値を指定しなかった場合は、統計的に増加する (または
step
が負の場合は減少する) 一意の値が自動的に割り当てられます。 この句は、Delta Lake のテーブルでのみサポートされます。 この句は、BIGINT データ型の列にのみ使用できます。自動的に割り当てられた値は、
start
から始まり、step
ずつ増えます。 割り当てられた値は一意ですが、連続している保証はありません。 どちらのパラメーターも省略可能で、既定値は 1 です。step
に0
は指定できません。自動的に割り当てられた値が ID 列の型の範囲を超える場合、クエリは失敗します。
ALWAYS
を使用する場合は、ID 列に独自の値を指定できません。次の操作はサポートされていません。
- ID 列で
PARTITIONED BY
を行う - ID 列の
UPDATE
を行う
Note
Delta テーブルで ID 列を宣言すると、同時実行トランザクションが無効になります。 ID 列は、ターゲット テーブルへの同時書き込みが不要なユース ケースでのみ使用してください。
- ID 列で
DEFAULT default_expression
適用対象: Databricks SQL Databricks Runtime 11.3 LTS 以上
列が指定されていない場合に
INSERT
、UPDATE
、MERGE ... INSERT
で使われる列のDEFAULT
値を定義します。既定値が指定されていない場合、Null 許容列には
DEFAULT NULL
が適用されます。default_expression
は、リテラル、および組み込みの SQL 関数か演算子で構成することができます。ただし、次のものは除きます。また
default_expression
には、サブクエリを含めることはできません。DEFAULT
はCSV
、JSON
、PARQUET
、とORC
ソースでサポートされています。COMMENT column_comment
列について説明する文字列リテラル。
-
Delta Lake テーブル内の列に主キーまたは外部キー制約を追加します。
制約は、
hive_metastore
カタログ内のテーブルではサポートされていません。Delta Lake テーブルに CHECK 制約を追加するには、ALTER TABLE を使用します。
-
適用対象: Databricks SQL Databricks Runtime 12.2 LTS 以降 Unity Catalog のみ
重要
この機能はパブリック プレビュー段階にあります。
列マスク関数を追加して、機密データを匿名化します。 その列からの後続のすべてのクエリは、列の元の値の代わりに、列に対してその関数の評価結果を受け取ります。 これは、関数が呼び出し元ユーザーの ID またはグループ メンバーシップを検査して、値を編集するかどうかを決定できる、きめ細かいアクセス制御に役立ちます。
-
情報主キーまたは情報外部キーの制約を Delta Lake テーブルに追加します。
主な制約は、
hive_metastore
カタログ内のテーブルに対してはサポートされません。Delta Lake テーブルに CHECK 制約を追加するには、ALTER TABLE を使用します。
-
USING data_source
data_source
には、ファイル形式またはフェデレーション JDBC データ ソースのいずれかを指定できます。ファイル形式は、次のいずれかである必要があります。
AVRO
BINARYFILE
CSV
DELTA
JSON
ORC
PARQUET
TEXT
DELTA
以外のファイル形式の場合は、テーブル カタログがhive_metastore
されていない限り、LOCATION
も指定する必要があります。次のフェデレーション JDBC ソースがサポートされています。
POSTGRESQL
SQLSERVER
MYSQL
BIGQUERY
NETSUITE
ORACLE
REDSHIFT
SNOWFLAKE
SQLDW
SYNAPSE
SALESFORCE
SALESFORCE_DATA_CLOUD
TERADATA
WORKDAY_RAAS
MONGODB
フェデレーション JDBC ソースを指定する場合は、必要な接続情報を含む
OPTIONS
句も指定する必要があります。 フェデレーション データ ソース クエリの詳細については JDBC を使用したデータベースのクエリを参照してください。テーブルに使用する次の追加のファイル形式が Databricks Runtime でサポートされています。
JDBC
LIBSVM
org.apache.spark.sql.sources.DataSourceRegister
のカスタム実装の完全修飾クラス名。
USING
を省略した場合、既定値はDELTA
です。次の説明は Databricks Runtime に関係します。
HIVE
は Databricks Runtime で Hive SerDe テーブルを作成するためにサポートされています。 Hive 固有のfile_format
やrow_format
を、OPTIONS
句を使用して指定できます。これは、大文字と小文字を区別しない文字列マップです。option_keys
は次のとおりです。FILEFORMAT
INPUTFORMAT
OUTPUTFORMAT
SERDE
FIELDDELIM
ESCAPEDELIM
MAPKEYDELIM
LINEDELIM
table_clauses
必要に応じて、新しいテーブルの場所、パーティション分割、クラスタリング、オプション、コメント、およびユーザー定義のプロパティを指定します。 各サブ句は、1 回だけ指定できます。
-
列のサブセットによってテーブルをパーティション分割する省略可能な句。
Note
Delta テーブルを定義しない場合、パーティション分割列は、列の仕様で以前に定義されている場合でも、テーブルの末尾に配置されます。 Delta テーブルの場合は
PARTITIONED BY
ではなく、CLUSTER BY
を使用することを検討してください。 -
適用対象: Databricks SQL Databricks Runtime 13.3 以降
列のサブセットによって Delta テーブルをクラスター化するための省略可能な句。 他のテーブルをクラスター化するには、
clustered_by_clause
を使用します。Delta Lake リキッド クラスタリングを
PARTITIONED BY
と組み合わせることはできません。 clustered_by_clause
必要に応じて、列のサブセットを使用して、テーブルまたは各パーティションを固定数のハッシュ バケットにクラスター化します。
クラスタリングは、Delta Lake のテーブルではサポートされていません。
CLUSTERED BY
各パーティション (パーティション分割が指定されていない場合は、テーブル) のクラスター化に使用する列のセットを指定します。
-
テーブル内の
column_identifier
を参照する識別子。 複数の列を指定する場合は、重複しないようにする必要があります。 クラスタリングはパーティション レベルで動作するため、パーティション列をクラスター列として指定しないでください。
-
SORTED BY
必要に応じて、バケット内の行の並べ替え順序を維持します。
sort_column
バケットの並べ替えに使用する列。 この列をパーティション列にすることはできません。 並べ替え列は一意である必要があります。
ASC または DESC
必要に応じて、
sort_column
の並べ替えを昇順 (ASC
) にするか、降順 (DESC
) にするかを指定します。 既定値はASC
です。
INTO num_buckets BUCKETS
各パーティション (またはパーティション分割が指定されていない場合はテーブル) が分割される分のバケット数を指定する INTEGER リテラル。
LOCATION path [ WITH ( CREDENTIAL credential_name ) ]
テーブル データが格納されているディレクトリへの省略可能なパス。これは、分散ストレージ上のパスにすることもできます。
path
は文字列リテラルである必要があります。 場所を指定しない場合、テーブルはmanaged table
と見なされ、Azure Databricks によって既定のテーブルの場所が作成されます。場所を指定すると、テーブルは外部テーブルになります。
hive_metastore
カタログに存在しないテーブルについては、有効なストレージ資格情報が指定されていない限り、テーブルのpath
を外部の場所で保護する必要があります。マネージド テーブルの場所と重複する場所に外部テーブルを作成することはできません。
Delta Lake テーブルのテーブル構成は、データが存在する場合、
LOCATION
から継承されます。 そのため、TBLPROPERTIES
、table_specification
、またはPARTITIONED BY
の句が Delta Lake テーブルに指定されている場合は、それらが Delta Lake 場所データと正確に一致している必要があります。-
1 つ以上のユーザー定義テーブル オプションを設定またはリセットします。
COMMENT table_comment
テーブルについて説明する文字列リテラル。
-
必要に応じて、1 つ以上のユーザー定義プロパティを設定します。
WITH ROW FILTER 句
適用対象: Databricks SQL Databricks Runtime 12.2 LTS 以降 Unity Catalog のみ
行フィルター関数をテーブルに追加します。 そのテーブルからの後続のすべてのクエリは、関数がブール値 TRUE に評価される行のサブセットを受け取ります。 これは、関数が呼び出したユーザーの ID またはグループ メンバーシップを検査して、特定の行をフィルター処理するかどうかを決定できる、きめ細かいアクセス制御に役立ちます。
-
AS クエリ
この省略可能な句により、
query
からのデータを使用してテーブルが事前設定されます。query
を指定する場合は、table_specification
も指定することはしないで ください。 テーブル スキーマはクエリから生成されます。Azure Databricks では、作成されたテーブルに入力クエリとまったく同じデータが確実に含まれるように、基になるデータ ソースが入力クエリのデータで上書きされることに注意してください。
例
-- Creates a Delta table
> CREATE TABLE student (id INT, name STRING, age INT);
-- Use data from another table
> CREATE TABLE student_copy AS SELECT * FROM student;
-- Creates a CSV table from an external directory
> CREATE TABLE student USING CSV LOCATION '/path/to/csv_files';
-- Specify table comment and properties
> CREATE TABLE student (id INT, name STRING, age INT)
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)
TBLPROPERTIES ('foo'='bar')
COMMENT 'this is a comment';
-- Create partitioned table
> CREATE TABLE student (id INT, name STRING, age INT)
PARTITIONED BY (age);
-- Create a table with a generated column
> CREATE TABLE rectangles(a INT, b INT,
area INT GENERATED ALWAYS AS (a * b));
-- Create an external table connected to Oracle
> CREATE TABLE IF NOT EXISTS ora_tab
USING ORACLE
OPTIONS (
url '<jdbc-url>',
dbtable '<table-name>',
user '<username>',
password '<password>'
);
> SELECT * FROM ora_tab;