CREATE TABLE ステートメントは、非パーティション化テーブル、パーティションテーブル、外部テーブル、およびクラスター化テーブルを作成します。
制限事項
パーティションテーブルは最大 6 段階のパーティションレベルをサポートします。たとえば、日付でパーティション化されたテーブルでは、
year/month/week/day/hour/minuteのようなレベルを使用できます。デフォルトでは、テーブルは最大 60,000 個のパーティションを持つことができます。この制限はプロジェクト単位で設定可能です。
その他のテーブルに関する制限事項については、「MaxCompute SQL の制限事項」をご参照ください。
構文
内部テーブル
内部テーブル(非パーティション化またはパーティション化)の作成
CREATE [OR REPLACE] TABLE [IF NOT EXISTS] <table_name> (
<col_name> <data_type>, ... )
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type> [COMMENT <col_comment>], ...)]
[AUTO PARTITIONED
BY (<auto_partition_expression> [AS <auto_partition_column_name>])
[TBLPROPERTIES('ingestion_time_partition'='true')]
];クラスター化テーブル
クラスター化テーブルの作成
CREATE TABLE [IF NOT EXISTS] <table_name> (
<col_name> <data_type>, ... )
[CLUSTERED BY | RANGE CLUSTERED BY (<col_name> [, <col_name>, ...])
[SORTED BY (<col_name> [ASC | DESC] [, <col_name> [ASC | DESC] ...])]
INTO <number_of_buckets> BUCKETS];外部テーブル
外部テーブルの作成
以下の例では、組み込みのテキストデータパーサーを使用して OSS 外部テーブルを作成する方法を示します。詳細については、「ORC 外部テーブル」をご参照ください。
CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name> (
<col_name> <data_type>, ... )
STORED AS '<file_format>'
[WITH SERDEPROPERTIES (options)]
LOCATION '<oss_location>';トランザクションテーブルおよび Delta テーブル
トランザクションテーブルを作成します。このタイプのテーブルでは、UPDATE および DELETE 操作を実行できますが、一定の制限があります。
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] <table_name> ( <col_name <data_type> [NOT NULL] [DEFAULT <default_value>] [COMMENT <col_comment>], ... [COMMENT <table_comment>] [TBLPROPERTIES ("transactional"="true")];Delta テーブルを作成します。プライマリキーと組み合わせることで、アップサート、増分クエリ、タイムトラベルなどの操作が可能になります。
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] <table_name> ( <col_name <data_type> [NOT NULL] [DEFAULT <default_value>] [COMMENT <col_comment>], ... [PRIMARY KEY (<pk_col_name>[, <pk_col_name2>, ...] )]) [COMMENT <table_comment>] [CLUSTERED BY (<pk_col_name>[, <pk_col_name2>, ...] )] [TBLPROPERTIES ("transactional"="true" [, "write.bucket.num" = "N", "acid.data.retain.hours"="hours"...])] [LIFECYCLE <days>];プライマリキーを持つ Delta テーブルでは、プライマリキーの一部をハッシュクラスタリングキーとして使用できます。
プライマリキーを持つ Delta テーブルでは、システムはデフォルトでハッシュクラスタリングによりデータを分散します。デフォルトのクラスタリングキーは、プライマリキー列の完全なセットです。ただし、特定のビジネスシナリオでは、クエリがプライマリキー列の一部を頻繁にフィルター条件として使用することがあります。このような場合、明示的にプライマリキー列の一部をクラスタリングキーとして指定することで、データがその部分に基づいて分散・格納されるようになり、フィルター処理のパフォーマンスが向上します。
クラスタリングキーを明示的に指定した場合、システムは指定された列に基づいてテーブルデータをハッシュバケットに分散します。クラスタリングキーは、プライマリキー列の一部である必要があります。
クラスタリングキーを明示的に指定しない場合、システムはプライマリキー列の完全なセットをデフォルトのクラスタリングキーとして使用します。
テーブル作成後にクラスタリングキーを変更することはできません。必ずテーブル作成時に指定してください。
CTAS および LIKE 句
既存のテーブルを基に新しいテーブルを作成し、データをコピーしますが、パーティションプロパティはコピーされません。この句は、外部テーブルおよび外部 Lakehouse プロジェクト内のテーブルに適用されます。
CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] AS <select_statement>;既存のテーブルと同じ構造を持つ新しいテーブルを作成しますが、データはコピーされません。この句は、外部テーブルおよび外部 Lakehouse プロジェクト内のテーブルに適用されます。
CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] LIKE <existing_table_name>;
パラメーター
共通パラメーター
一般パラメーター
パラメーター | 必須 | 説明 | 備考 |
OR REPLACE | いいえ |
| これは、以下のコマンドを順次実行することと同等です。 |
EXTERNAL | いいえ | 外部テーブルを作成します。 | 該当なし |
IF NOT EXISTS | いいえ | 同名のテーブルがまだ存在しない場合にのみ、テーブルを作成します。 | IF NOT EXISTS オプションを指定せずに同名のテーブルがすでに存在する場合、エラーが報告されます。IF NOT EXISTS を指定した場合、同名のテーブルがすでに存在していても、そのテーブルのスキーマが作成対象テーブルのスキーマと一致しなくても操作は成功します。既存テーブルのメタデータは変更されません。 |
table_name | はい | テーブル名です。 | テーブル名は 128 バイト以下で、英字、数字、アンダースコア (_) のみを含む必要があります。大文字と小文字は区別されません。先頭を英字で始めることが推奨されます。 |
PRIMARY KEY(pk) | いいえ | テーブルのプライマリキーです。 | 1 つ以上の列をプライマリキーとして定義できます。これにより、これらの列の値の組み合わせがテーブル内で一意になることが保証されます。構文は標準 SQL のプライマリキー構文に従います。プライマリキー列は NOT NULL に設定する必要があり、変更できません。 重要 このパラメーターは Delta テーブルにのみ適用されます。 |
col_name | はい | 列名です。 |
|
col_comment | いいえ | 列のコメントです。 | 1,024 バイト以下の文字列である必要があります。 |
data_type | はい | 列のデータの型です。 | サポートされるデータの型には、BIGINT、DOUBLE、BOOLEAN、DATETIME、DECIMAL、STRING などがあります。詳細については、「データの型」をご参照ください。 |
NOT NULL | いいえ | この列に NULL 値を含めないことを指定します。 | NOT NULL プロパティの変更方法については、「パーティション操作」をご参照ください。 |
default_value | いいえ | 列のデフォルト値です。 |
説明
|
table_comment | いいえ | テーブルのコメントです。 | 1,024 バイト以下の文字列である必要があります。 |
LIFECYCLE | いいえ | テーブルのライフサイクル(日数)です。 | 正の整数のみがサポートされます。単位は日です。
|
パーティションテーブル
パーティションテーブルのパラメーター
パーティションテーブルのパラメーター
MaxCompute では、標準パーティションテーブルと自動パーティションテーブルの 2 種類のパーティションテーブルがサポートされています。ユースケースに応じて、パーティション列の生成方法を選択できます。詳細については、「パーティションテーブルの概要」をご参照ください。
標準パーティションテーブルのパラメーター
パラメーター | 必須 | 説明 | 備考 |
PARTITIONED BY | はい | 標準パーティションテーブルのパーティションを指定します。 | PARTITIONED BY と AUTO PARTITIONED BY の両方を同時に指定することはできません。 |
col_name | はい | パーティション列の名前です。 |
|
data_type | はい | パーティション列のデータの型です。 | MaxCompute V1.0 では STRING 型のみがサポートされています。MaxCompute V2.0 では、TINYINT、SMALLINT、INT、BIGINT、VARCHAR、STRING などの追加のパーティション型がサポートされています。詳細については、「データの型」をご参照ください。テーブルをパーティション化すると、パーティションの追加、データの更新、データの読み取りなどの操作において全表スキャンが不要となり、効率が向上します。 |
col_comment | いいえ | パーティション列のコメントです。 | 1,024 バイト以下の文字列である必要があります。 |
パーティション値は 255 バイト以下である必要があります。また、漢字などのマルチバイト文字を含めることはできません。値は英字で始まり、英字、数字、および以下の文字のみを含む必要があります:スペース、コロン (:)、アンダースコア (_)、ドル記号 ($)、シャープ記号 (#)、ピリオド (.)、感嘆符 (!)、アットマーク (@)。タブ (\t)、改行 (\n)、スラッシュ (/) などのエスケープ文字の動作は未定義です。
自動パーティションテーブルのパラメーター
自動パーティションテーブルのパーティション列は自動的に生成されます。自動パーティションテーブルの使用方法については、「パーティションテーブルの種類」をご参照ください。
パラメーター | 必須 | 説明 | 備考 |
AUTO PARTITIONED BY | はい | 自動パーティションテーブルのパーティションを指定します。 | PARTITIONED BY と AUTO PARTITIONED BY の両方を同時に指定することはできません。 |
auto_partition_expression | はい | パーティション列の計算方法を定義する式です。 現在、パーティション列の生成には TRUNC_TIME 関数のみが使用可能です。また、パーティション列は 1 つのみサポートされます。 | TRUNC_TIME 関数は、時間または日付型の列から、指定された時間単位に基づいてデータを切り捨て、パーティション列を生成します。 |
auto_partition_column_name | いいえ | 生成されるパーティション列の名前です。 名前を指定しない場合、システムはデフォルトで | パーティション式による計算結果に基づき、STRING 型のパーティション列が生成されます。この列の名前は明示的に指定できますが、データの型や値を直接変更することはできません。 |
TBLPROPERTIES('ingestion_time_partition'='true') | いいえ | データのインジェスト時間に基づいてパーティション列を生成するかどうかを指定します。 | データのインジェスト時間に基づくパーティションの生成について詳しくは、「データのインジェスト時間に基づく自動パーティションテーブル」をご参照ください。 |
クラスター化テーブル
クラスター化テーブルのパラメーター
クラスター化テーブルは、ハッシュクラスター化テーブルとレンジクラスター化テーブルに分類されます。
ハッシュクラスター化テーブル
パラメーター | 必須 | 説明 | 備考 |
CLUSTERED BY | はい | ハッシュキーを指定します。MaxCompute は指定された列に対してハッシュ値を計算し、その値に基づいてデータをハッシュバケットに分散します。 | MaxCompute は指定された列に対してハッシュ演算を行い、ハッシュ値に基づいてデータをバケットに分散します。データスキューおよびホットスポットを防止し、良好な並列実行パフォーマンスを達成するためには、 |
SORTED BY | はい | 各ハッシュバケット内での列のソート順を指定します。 | 最適なパフォーマンスを得るためには、SORTED BY と CLUSTERED BY に同じ列を指定することを推奨します。SORTED BY 句を指定すると、MaxCompute は自動的にインデックスを作成し、クエリの高速化に活用します。 |
number_of_buckets | はい | ハッシュバケットの数を指定します。 | この値は必須であり、その値はデータ量に依存します。デフォルトでは、MaxCompute は最大 1,111 個の reducer をサポートしており、これによりハッシュバケット数は 1,111 に制限されます。この制限を拡大するには、 |
ハッシュバケット数を選択する際には、以下の 2 つの原則に従ってください。
ハッシュバケットサイズを適切に保つ:推奨される各ハッシュバケットのサイズは約 500 MB です。たとえば、推定パーティションサイズが 500 GB の場合、バケット数を 1,000 に設定すると、平均ハッシュバケットサイズは約 500 MB になります。非常に大きなテーブルでは、500 MB の制限を超えることも可能です。バケットあたり 2 GB ~ 3 GB のサイズが適しています。また、
set odps.stage.reducer.num=<concurrency>;コマンドを実行することで、1,111 個のハッシュバケット制限を超えることも可能です。join操作の最適化のため、シャッフルおよびソートステップを排除すると、パフォーマンスが大幅に向上します。そのためには、2 つのテーブルのハッシュバケット数が互いに倍数関係にある必要があります(例:256 と 512)。ハッシュバケット数を 2 のべき乗(2n)に設定すること(例:512、1024、2048、4096)が推奨されます。これにより、システムはハッシュバケットを自動的に分割または統合し、シャッフルおよびソートステップを排除できるため、実行効率が向上します。
レンジクラスター化テーブル
パラメーター | 必須 | 説明 | 備考 |
RANGE CLUSTERED BY | はい | レンジクラスタリング列を指定します。 | MaxCompute は指定された列に対してバケット化処理を実行し、バケット番号に基づいてデータをバケットに分散します。 |
SORTED BY | はい | 各バケット内での列のソート順を指定します。 | ハッシュクラスター化テーブルと同様の使い方です。 |
number_of_buckets | はい | バケット数を指定します。 | レンジクラスター化テーブルでは、ハッシュクラスター化テーブルに適用される 2 のべき乗(2n)というベストプラクティスは必須ではありません。データが均等に分散されている場合、任意のバケット数を指定できます。このパラメーターはレンジクラスター化テーブルでは任意であり、省略した場合、システムはデータ量に基づいて最適なバケット数を自動的に決定します。 |
レンジクラスター化テーブルに対して結合または集約操作を実行する場合、結合キーまたはグループ化キーがレンジクラスタリングキーまたはそのプレフィックスである場合、データの再配布(シャッフル削除)を排除してパフォーマンスを向上させることができます。この機能を有効または無効にするには、set odps.optimizer.enable.range.partial.repartitioning=true/false; コマンドを実行します。デフォルトでは無効になっています。
クラスター化テーブルのメリット:
最適化されたバケットプルーニング
最適化された集約処理
最適化されたストレージ
クラスター化テーブルの制限事項:
INSERT INTOはサポートされていません。INSERT OVERWRITEのみを使用してデータを追加できます。Tunnel を使用したレンジクラスター化テーブルへのデータの直接アップロードはサポートされていません。Tunnel はデータを順序なしでアップロードするためです。
バックアップおよび回復機能はサポートされていません。
外部テーブル
外部テーブルのパラメーター
このセクションでは、OSS 外部テーブルの作成パラメーターを例として説明します。その他の種類の外部テーブルの作成パラメーターについては、「外部テーブル」をご参照ください。
パラメーター | 必須 | 説明 |
| はい | 外部テーブルのデータ形式に基づいて file_format を指定します。 |
| いいえ | 外部テーブルの権限付与、圧縮、文字解析に関連するパラメーターを指定します。 |
oss_location | はい | 外部テーブルデータの OSS ストレージ場所です。詳細については、「OSS 外部テーブル」をご参照ください。 |
トランザクションテーブルおよび Delta テーブル
トランザクションテーブルおよび Delta テーブルのパラメーター
Delta テーブルのパラメーター
Delta テーブルは、ニアリアルタイムでの読み取りおよび書き込み、増分ストレージおよびアクセス、リアルタイム更新をサポートするテーブル形式です。現在はプライマリキー付きテーブルのみがサポートされています。
パラメーター | 必須 | 説明 | 備考 |
PRIMARY KEY(PK) | はい | Delta テーブルのプライマリキーを定義します。複数の列を含めることができます。 | 構文は標準 SQL のプライマリキー構文に従います。プライマリキー列は NOT NULL に設定する必要があり、変更できません。プライマリキーを設定すると、プライマリキー列に基づいてデータの重複排除が行われます。一意性制約は、単一のパーティション内、または非パーティション化テーブル内で適用されます。 |
transactional | はい | Delta テーブルを作成する際に必須です。このパラメーターは | このテーブルが MaxCompute ACID テーブルのトランザクション特性をサポートすることを示します。テーブルは、スナップショット分離レベルを保証するためのマルチバージョン同時実行制御(MVCC)モデルを使用します。 |
write.bucket.num | いいえ | デフォルト値は 16 です。有効範囲は | 各パーティションまたは非パーティション化テーブルのバケット数を指定します。これは、データ書き込み時の同時実行ノード数にも相当します。パーティションテーブルではこのパラメーターを変更でき、新しいパーティションにのみ新設定が適用されます。非パーティション化テーブルではこのパラメーターを変更できません。以下の推奨事項を考慮してください。
|
acid.data.retain.hours | いいえ | デフォルト値は 24 です。有効範囲は | タイムトラベルを使用して履歴データ状態をクエリできる時間範囲(時間単位)を指定します。168 時間(7 日間)を超えるタイムトラベル履歴が必要な場合は、MaxCompute テクニカルサポートにお問い合わせください。
|
acid.incremental.query.out.of.time.range.enabled | いいえ | デフォルト値: |
|
acid.write.precombine.field | いいえ | 単一の列名を指定します。 | 列名を指定した場合、システムはこの列をプライマリキー列と組み合わせて、同一コミット内のデータの重複排除を行います。これにより、データの一意性および整合性が保証されます。 説明 単一のデータコミットが 128 MB を超える場合、複数のファイルが生成されます。このパラメーターは複数のファイル間では適用されません。 |
acid.partial.fields.update.enable | いいえ |
| このパラメーターはテーブル作成時に設定されます。テーブル作成後は変更できません。 |
Delta テーブルのその他のパラメーター要件:
LIFECYCLE:テーブルのライフサイクルはタイムトラベル保持期間以上である必要があります。すなわち、
lifecycle >= acid.data.retain.hours / 24です。テーブル作成時にチェックが行われ、この条件を満たさない場合はエラーが報告されます。サポートされていない機能:
CLUSTERED BY、EXTERNAL、CREATE TABLE ASはサポートされていません。
その他の制限事項:
現在、他のエンジンは Delta テーブルを直接操作できません。MaxCompute SQL のみがサポートされています。
標準テーブルを Delta テーブルに変換することはできません。
Delta テーブルのプライマリキー列に対するスキーマ変更はできません。
トランザクションテーブルのパラメーター
パラメーター | 必須 | 説明 |
TBLPROPERTIES("transactional"="true") | はい | テーブルをトランザクションテーブルとして設定します。その後、 |
トランザクションテーブルには以下の制限事項があります。
transactionalプロパティはテーブル作成時のみ設定可能です。既存のテーブルに対してALTER TABLEを使用してこのプロパティを変更することはできません。以下のステートメントはエラーを返します。ALTER TABLE not_txn_tbl SET TBLPROPERTIES("transactional"="true"); -- エラーが返されます。 FAILED: Catalog Service Failed, ErrorCode: 151, Error Message: Set transactional is not supportedクラスター化テーブルまたは外部テーブルをトランザクションテーブルとして設定することはできません。
標準内部テーブル、外部テーブル、またはクラスター化テーブルをトランザクションテーブルに変換したり、その逆の変換をしたりすることはできません。
トランザクションテーブル内のファイルの自動コンパクションはサポートされていません。手動で実行する必要があります。詳細については、「トランザクションテーブルのファイルのコンパクション」をご参照ください。
merge partition操作はサポートされていません。他のシステムからのトランザクションテーブルへのアクセスは限定されています。たとえば、MaxCompute Graph では読み取りおよび書き込み操作がサポートされていません。Spark および PAI では読み取り操作のみがサポートされています。
重要なデータに対して
update、delete、またはinsert overwrite操作を実行する前に、SELECT...INSERTステートメントを使用して、別のテーブルに手動でバックアップしてください。
既存のテーブルからのテーブル作成
テーブルの作成(既存のテーブルから)
CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] AS <select_statement>;ステートメントを使用して、別のテーブルを作成し、同時にデータを新しいテーブルにコピーできます。このステートメントはパーティションプロパティをコピーしません。ソーステーブルのパーティション列は、宛先テーブルでは通常の列として扱われます。ソーステーブルのライフサイクルプロパティもコピーされません。
lifecycle パラメーターを使用して、新しいテーブルのライフサイクルを指定できます。このステートメントは、外部テーブルからデータをコピーして内部テーブルを作成することもサポートしています。
CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] LIKE <existing_table_name>;ステートメントを使用して、既存のテーブルと同じスキーマを持つ新しいテーブルを作成できます。このステートメントはスキーマをコピーしますが、データやソーステーブルのライフサイクルプロパティはコピーしません。
lifecycle パラメーターを使用して、新しいテーブルのライフサイクルを指定できます。このステートメントは、外部テーブルのスキーマをコピーして内部テーブルを作成することもサポートしています。
例
非パーティション化テーブル
非パーティション化テーブルを作成します。
CREATE TABLE test1 (key STRING);非パーティション化テーブルを作成し、列のデフォルト値を指定します。
CREATE TABLE test_default( tinyint_name tinyint NOT NULL default 1Y, smallint_name SMALLINT NOT NULL DEFAULT 1S, int_name INT NOT NULL DEFAULT 1, bigint_name BIGINT NOT NULL DEFAULT 1, binary_name BINARY , float_name FLOAT , double_name DOUBLE NOT NULL DEFAULT 0.1, decimal_name DECIMAL(2, 1) NOT NULL DEFAULT 0.0BD, varchar_name VARCHAR(10) , char_name CHAR(2) , string_name STRING NOT NULL DEFAULT 'N', boolean_name BOOLEAN NOT NULL DEFAULT TRUE );
パーティションテーブル
時刻ベースのデータ列を用いた時刻関数により、自動的にパーティションを生成する AUTO PARTITION パーティションテーブルを作成します。
-- sale_date 列を月単位で切り捨てて、sale_month という名前のパーティション列を生成し、この列でテーブルをパーティション化します。 CREATE TABLE IF NOT EXISTS auto_sale_detail( shop_name STRING, customer_id STRING, total_price DOUBLE, sale_date DATE ) AUTO PARTITIONED BY (TRUNC_TIME(sale_date, 'month') AS sale_month);データ取り込み時間に基づいてパーティションを自動生成する AUTO PARTITION パーティションテーブルを作成します。システムは、データが MaxCompute に書き込まれるタイミングを自動的に取得し、時刻関数を用いてパーティションを生成します。
-- テーブル作成後、データ書き込み時にシステムが自動的にデータ取り込み時間 (_partitiontime) を取得し、日単位で切り捨てて sale_date という名前のパーティション列を生成し、この列でテーブルをパーティション化します。 CREATE TABLE IF NOT EXISTS auto_sale_detail2( shop_name STRING, customer_id STRING, total_price DOUBLE, _partitiontime TIMESTAMP_NTZ) AUTO PARTITIONED BY (TRUNC_TIME(_partitiontime, 'day') AS sale_date) TBLPROPERTIES('ingestion_time_partition'='true');
ハッシュまたは範囲クラスター化テーブル
ハッシュクラスター化された非パーティション化テーブルを作成します。
CREATE TABLE t1 (a STRING, b STRING, c BIGINT) CLUSTERED BY (c) SORTED BY (c) INTO 1024 buckets;ハッシュクラスター化されたパーティションテーブルを作成します。
CREATE TABLE t2 (a STRING, b STRING, c BIGINT) PARTITIONED BY (dt STRING) CLUSTERED BY (c) SORTED BY (c) INTO 1024 buckets;範囲クラスター化された非パーティション化テーブルを作成します。
CREATE TABLE t3 (a STRING, b STRING, c BIGINT) RANGE CLUSTERED BY (c) SORTED BY (c) INTO 1024 buckets;範囲クラスター化されたパーティションテーブルを作成します。
CREATE TABLE t4 (a STRING, b STRING, c BIGINT) PARTITIONED BY (dt STRING) RANGE CLUSTERED BY (c) SORTED BY (c);
トランザクションテーブル
非パーティション化トランザクションテーブルを作成します。
CREATE TABLE t5(id BIGINT) TBLPROPERTIES ("transactional"="true");パーティション化トランザクションテーブルを作成します。
CREATE TABLE IF NOT EXISTS t6(id BIGINT) PARTITIONED BY (ds STRING) TBLPROPERTIES ("transactional"="true");
内部テーブル
OSS 外部パーティションテーブルからデータをコピーして内部テーブルを作成します。この内部テーブルにはパーティションプロパティは含まれません。
OSS 外部テーブルと MaxCompute 内部テーブルを作成します。CREATE TABLE AS を使用して内部テーブルを作成します。
-- OSS 外部テーブルを作成し、そこにデータを挿入します。 CREATE EXTERNAL TABLE max_oss_test(a INT, b INT, c INT) STORED AS TEXTFILE LOCATION "oss://oss-cn-hangzhou-internal.aliyuncs.com/<bucket_name>"; INSERT INTO max_oss_test VALUES (101, 1, 20241108), (102, 2, 20241109), (103, 3, 20241110); SELECT * FROM max_oss_test; -- 結果 a b c 101 1 20241108 102 2 20241109 103 3 20241110 -- CREATE TABLE AS を使用して内部テーブルを作成します。 CREATE TABLE from_exetbl_oss AS SELECT * FROM max_oss_test; -- 新しい内部テーブルをクエリします。 SELECT * FROM from_exetbl_oss; -- 結果より、すべてのデータがコピーされていることが確認できます。 a b c 101 1 20241108 102 2 20241109 103 3 20241110DESC from_exetbl_oss;コマンドを実行して、内部テーブルのスキーマを表示します。コマンドの出力は以下のとおりです。+------------------------------------------------------------------------------------+ | Owner: ALIYUN$*********** | | Project: ***_*****_*** | | TableComment: | +------------------------------------------------------------------------------------+ | CreateTime: 2023-01-10 15:16:33 | | LastDDLTime: 2023-01-10 15:16:33 | | LastModifiedTime: 2023-01-10 15:16:33 | +------------------------------------------------------------------------------------+ | InternalTable: YES | Size: 919 | +------------------------------------------------------------------------------------+ | Native Columns: | +------------------------------------------------------------------------------------+ | Field | Type | Label | Comment | +------------------------------------------------------------------------------------+ | a | string | | | | b | string | | | | c | string | | | +------------------------------------------------------------------------------------+
OSS 外部パーティションテーブルからスキーマをコピーして内部テーブルを作成します。この内部テーブルにはパーティションプロパティが含まれます。
内部テーブル
from_exetbl_likeを作成します。MaxCompute から OSS 外部テーブルをクエリし、CREATE TABLE LIKE を使用して内部テーブルを作成します。-- MaxCompute から OSS 外部テーブルをクエリします。 SELECT * FROM max_oss_test; -- 結果 a b c 101 1 20241108 102 2 20241109 103 3 20241110 -- CREATE TABLE LIKE を使用して内部テーブルを作成します。 CREATE TABLE from_exetbl_like LIKE max_oss_test; -- 新しい内部テーブルをクエリします。 SELECT * FROM from_exetbl_like; -- 結果:テーブルスキーマのみが返されます。 a b cDESC from_exetbl_like;コマンドを実行して、内部テーブルのスキーマを表示します。コマンドの出力は以下のとおりです。+------------------------------------------------------------------------------------+ | Owner: ALIYUN$************ | | Project: ***_*****_*** | | TableComment: | +------------------------------------------------------------------------------------+ | CreateTime: 2023-01-10 15:09:47 | | LastDDLTime: 2023-01-10 15:09:47 | | LastModifiedTime: 2023-01-10 15:09:47 | +------------------------------------------------------------------------------------+ | InternalTable: YES | Size: 0 | +------------------------------------------------------------------------------------+ | Native Columns: | +------------------------------------------------------------------------------------+ | Field | Type | Label | Comment | +------------------------------------------------------------------------------------+ | a | string | | | | b | string | | | +------------------------------------------------------------------------------------+ | Partition Columns: | +------------------------------------------------------------------------------------+ | c | string | | +------------------------------------------------------------------------------------+
Delta テーブル
Delta テーブルを作成します。
CREATE TABLE mf_tt (pk BIGINT NOT NULL PRIMARY KEY, val BIGINT) TBLPROPERTIES ("transactional"="true");Delta テーブルを作成し、キーとなるテーブルプロパティを設定します。
CREATE TABLE mf_tt2 ( pk BIGINT NOT NULL, pk2 BIGINT NOT NULL, val BIGINT, val2 BIGINT, PRIMARY KEY (pk, pk2) ) TBLPROPERTIES ( "transactional"="true", "write.bucket.num" = "64", "acid.data.retain.hours"="120" ) LIFECYCLE 7;
その他の方法
既存テーブルの置き換え
元のテーブル
my_tableを作成し、そこにデータを挿入します。CREATE OR REPLACE TABLE my_table(a BIGINT); INSERT INTO my_table(a) VALUES (1),(2),(3);OR REPLACEを使用して、同じ名前の新しいテーブルを作成し、列を変更します。CREATE OR REPLACE TABLE my_table(b STRING);my_tableテーブルをクエリします。クエリの結果は以下のとおりです。+------------+ | b | +------------+ +------------+以下の SQL ステートメントは無効です。
CREATE OR REPLACE TABLE IF NOT EXISTS my_table(b STRING); CREATE OR REPLACE TABLE my_table AS SELECT; CREATE OR REPLACE TABLE my_table LIKE newtable;
データのコピーとライフサイクルの設定
-- sale_detail_ctas1 という名前の新しいテーブルを作成し、sale_detail からデータをコピーしてライフサイクルを設定します。
SET odps.sql.allow.fullscan=true;
CREATE TABLE sale_detail_ctas1 LIFECYCLE 10 AS SELECT * FROM sale_detail;DESC EXTENDED sale_detail_ctas1; コマンドを実行して、テーブルのスキーマやライフサイクルなどの詳細情報を表示します。
この例では、sale_detail はパーティションテーブルです。CREATE TABLE ... AS select_statement ... ステートメントを使用して sale_detail_ctas1 テーブルを作成すると、パーティションプロパティはコピーされません。ソーステーブルのパーティション列は、宛先テーブルでは通常の列として扱われます。したがって、sale_detail_ctas1 は 5 つの列を持つ非パーティション化テーブルとなります。
列値として定数を使用
SELECT 句で列値として定数を使用する場合、列名を明示的に指定してください。そうでない場合、作成されるテーブル sale_detail_ctas3 の第 4 列および第 5 列には、_c4 や _c5 といったデフォルトの列名が付与されます。
列名を明示的に指定します。
SET odps.sql.allow.fullscan=true; CREATE TABLE sale_detail_ctas2 AS SELECT shop_name, customer_id, total_price, '2013' AS sale_date, 'China' AS region FROM sale_detail;列名を指定しません。
SET odps.sql.allow.fullscan=true; CREATE TABLE sale_detail_ctas3 AS SELECT shop_name, customer_id, total_price, '2013', 'China' FROM sale_detail;
スキーマのコピーとライフサイクルの設定
CREATE TABLE sale_detail_like LIKE sale_detail LIFECYCLE 10;DESC EXTENDED sale_detail_like; コマンドを実行して、テーブルのスキーマやライフサイクルなどの詳細情報を表示します。
sale_detail_like のスキーマは sale_detail と同一です。列名、列コメント、テーブルコメントなどのすべてのプロパティがコピーされますが、ライフサイクルプロパティは除きます。ただし、sale_detail のデータは sale_detail_like テーブルにはコピーされません。
外部テーブルからのスキーマのコピー
-- mc_oss_extable_orc という外部テーブルと同じスキーマを持つ新しいテーブル mc_oss_extable_orc_like を作成します。
CREATE TABLE mc_oss_extable_orc_like LIKE mc_oss_extable_orc;DESC mc_oss_extable_orc_like; コマンドを実行して、テーブルのスキーマなどの詳細情報を表示します。
+------------------------------------------------------------------------------------+
| Owner: ALIYUN$****@***.aliyunid.com | Project: max_compute_7u************yoq |
| TableComment: |
+------------------------------------------------------------------------------------+
| CreateTime: 2022-08-11 11:10:47 |
| LastDDLTime: 2022-08-11 11:10:47 |
| LastModifiedTime: 2022-08-11 11:10:47 |
+------------------------------------------------------------------------------------+
| InternalTable: YES | Size: 0 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | Comment |
+------------------------------------------------------------------------------------+
| id | string | | |
| name | string | | |
+------------------------------------------------------------------------------------+新しいデータ型
SET odps.sql.type.system.odps2=true;
CREATE TABLE test_newtype (
c1 TINYINT,
c2 SMALLINT,
c3 INT,
c4 BIGINT,
c5 FLOAT,
c6 DOUBLE,
c7 DECIMAL,
c8 BINARY,
c9 TIMESTAMP,
c10 ARRAY<MAP<BIGINT,BIGINT>>,
c11 MAP<STRING,ARRAY<BIGINT>>,
c12 STRUCT<s1:STRING,s2:BIGINT>,
c13 VARCHAR(20))
LIFECYCLE 1;関連コマンド
ALTER TABLE:テーブルの構造またはプロパティを変更します。
TRUNCATE:テーブル内のすべてのデータを削除します。
DROP TABLE:テーブルを削除します。
DESC TABLE/VIEW:MaxCompute の内部テーブル、ビュー、マテリアライズドビュー、外部テーブル、クラスター化テーブル、またはトランザクショナルテーブルに関する情報を表示します。
SHOW:テーブルの SQL DDL 文、プロジェクト内のすべてのテーブルおよびビュー、またはテーブル内のすべてのパーティションを表示します。