すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:テーブルの作成と削除

最終更新日:Apr 28, 2026

MaxCompute でテーブルを作成および削除するコマンドの使用方法について説明します。

タイプ

説明

必要な権限

実行ツール

CREATE TABLE

非パーティション化テーブル、パーティションテーブル、外部テーブル、またはクラスター化テーブルを作成します。

プロジェクトに対する CreateTable 権限が必要です。

以下のツールでこれらのコマンドを実行できます。

DROP TABLE

パーティションテーブルまたは非パーティション化テーブルを削除します。

テーブルに対する Drop 権限が必要です。

テーブルの作成

非パーティション化テーブル、パーティションテーブル、外部テーブル、またはクラスター化テーブルを作成できます。

制限事項

  • パーティションテーブルは最大 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

いいえ

  • 同じ名前のテーブルが存在する場合、そのテーブルは削除され、新しいテーブルに置き換えられます。

  • CREATE OR REPLACE TABLE は、以下の句と併用できません。

    • CREATE TABLE ... IF NOT EXISTS

これは以下のコマンドを実行することと同等です。

DROP TABLE IF EXISTS <tableName>;  -- テーブルが存在する場合、削除します。
CREATE TABLE <tableName> ...;      -- 新しいテーブルを作成します。

EXTERNAL

いいえ

外部テーブルを作成します。

該当なし

IF NOT EXISTS

いいえ

同じ名前のテーブルがまだ存在しない場合にのみ、テーブルを作成します。

IF NOT EXISTS オプションを指定せず、同じ名前のテーブルがすでに存在する場合、エラーが報告されます。IF NOT EXISTS を指定すると、同じ名前のテーブルがすでに存在していても操作は成功します。このとき、既存テーブルのスキーマが作成しようとするテーブルのスキーマと一致していなくても、既存テーブルのメタデータは変更されません。

table_name

はい

テーブルの名前。

テーブル名は 128 バイト以下で、英数字およびアンダースコア (_) のみを含めることができます。大文字・小文字は区別されません。名前は英字で始めることが推奨されます。

PRIMARY KEY(pk)

いいえ

テーブルのプライマリキー。

1 つ以上の列をプライマリキーとして定義できます。これにより、これらの列の値の組み合わせがテーブル内で一意になることが保証されます。構文は標準 SQL のプライマリキー構文に従います。プライマリキー列は NOT NULL に設定する必要があり、変更できません。

重要

このパラメーターは Delta テーブルにのみ適用されます。

col_name

はい

列の名前。

  • 列名は 128 バイト以下で、英数字、アンダースコア (_)、または漢字を含めることができます。大文字・小文字は区別されません。名前は英字で始めることが推奨されます。

  • SET odps.sql.bigquery.compatible=true; コマンドを実行して BigQuery 互換モードを有効にすると、列名の長さを最大 256 バイトまでにできます。それ以外の場合、エラーが返されます。

col_comment

いいえ

列のコメント。

1,024 バイト以下の文字列である必要があります。

data_type

はい

列のデータの型。

サポートされるデータの型には、BIGINT、DOUBLE、BOOLEAN、DATETIME、DECIMAL、STRING などがあります。詳細については、「データの型」をご参照ください。

NOT NULL

いいえ

列に NULL 値を含めないように指定します。

NOT NULL プロパティの変更方法については、「パーティション操作」をご参照ください。

default_value

いいえ

列のデフォルト値。

insert 操作でこの列の値が指定されない場合、デフォルト値が列に書き込まれます。

説明

GETDATE()NOW() などの関数は、デフォルト値としてサポートされていません。

table_comment

いいえ

テーブルのコメント。

1,024 バイト以下の文字列である必要があります。

LIFECYCLE

いいえ

テーブルのライフサイクル(日数単位)。

正の整数のみサポートされます。単位は日です。

  • 非パーティション化テーブルの場合、ライフサイクルは最終データ変更時刻から開始されます。指定された日数の間データが変更されない場合、MaxCompute は自動的にテーブルを回収します。これは DROP TABLE 操作と同等です。

  • パーティションテーブルの場合、システムは各パーティションの LastModifiedTime に基づいてパーティションの回収を判断します。非パーティション化テーブルとは異なり、最後のパーティションが回収された後でもテーブル自体は削除されません。ライフサイクルはパーティションレベルではなくテーブルレベルでのみ設定できます。

パーティションテーブルのパラメーター

パーティションテーブルのパラメーター

MaxCompute は、標準および自動パーティションの 2 種類のパーティションテーブルをサポートしています。ユースケースに応じて、パーティション列の生成方法に基づいてテーブルタイプを選択できます。詳細については、「パーティションテーブルの概要」をご参照ください。

標準パーティションテーブルのパラメーター

パラメーター

必須

説明

備考

PARTITIONED BY

はい

標準パーティションテーブルのパーティションを指定します。

PARTITIONED BY または AUTO PARTITIONED BY のいずれか一方のみを使用できます。両方を同時に使用することはできません。

col_name

はい

パーティション列の名前。

  • 列名は 128 バイト以下で、英数字、アンダースコア (_)、または漢字を含めることができます。大文字・小文字は区別されません。名前は英字で始めることが推奨されます。

  • SET odps.sql.bigquery.compatible=true; コマンドを実行して BigQuery 互換モードを有効にすると、列名の長さを最大 256 バイトまでにできます。それ以外の場合、エラーが返されます。

data_type

はい

パーティション列のデータの型。

MaxCompute V1.0 では STRING 型のみサポートされています。MaxCompute V2.0 では、TINYINT、SMALLINT、INT、BIGINT、VARCHAR、STRING など、追加のパーティションタイプがサポートされています。詳細については、「データの型」をご参照ください。テーブルをパーティション化すると、パーティションの追加、データの更新、データの読み取りなどの操作で全表スキャンが不要になり、効率が向上します。

col_comment

いいえ

パーティション列のコメント。

1,024 バイト以下の文字列である必要があります。

説明

パーティション値は 255 バイト以下である必要があります。漢字などの 2 バイト文字を含めることはできません。値は英字で始まり、英数字および以下の文字のみを含めることができます:半角スペース、コロン (:)、アンダースコア (_)、ドル記号 ($)、シャープ記号 (#)、ピリオド (.)、感嘆符 (!)、アットマーク (@)。エスケープ文字 \t\n、および / などの他の文字の動作は未定義です。

自動パーティションテーブルのパラメーター

自動パーティションテーブルのパーティション列は自動的に生成できます。自動パーティションテーブルの使用方法の詳細については、「パーティションテーブルのタイプ」をご参照ください。

パラメーター

必須

説明

備考

AUTO PARTITIONED BY

はい

自動パーティションテーブルのパーティションを指定します。

PARTITIONED BY または AUTO PARTITIONED BY のいずれか一方のみを使用できます。両方を同時に使用することはできません。

auto_partition_expression

はい

パーティション列の計算方法を定義する式。

現在、パーティション列の生成には TRUNC_TIME 関数のみ使用できます。パーティション列は 1 つのみサポートされています。

TRUNC_TIME 関数は、指定された時間単位に基づいて時間または日付型の列のデータを切り捨て、パーティション列を生成できます。

auto_partition_column_name

いいえ

生成されたパーティション列の名前。

名前を指定しない場合、システムはデフォルトで _pt_col_0_ を使用します。この名前がすでに使用されている場合は、未使用の名前が見つかるまでサフィックスをインクリメントします(例:_pt_col_1_ または _pt_col_2_)。

パーティション式の計算に基づいて、STRING 型のパーティション列が生成されます。この列の名前を明示的に指定できますが、データの型や値を直接変更することはできません。

TBLPROPERTIES('ingestion_time_partition'='true')

いいえ

データのインジェスト時間に基づいてパーティション列を生成するかどうかを指定します。

データのインジェスト時間に基づくパーティションの生成の詳細については、「データインジェスト時間に基づく自動パーティションテーブル」をご参照ください。

クラスター化テーブルのパラメーター

クラスター化テーブルのパラメーター

クラスター化テーブルは、ハッシュクラスター化テーブルとレンジクラスター化テーブルに分類されます。

ハッシュクラスター化テーブル

パラメーター

必須

説明

備考

CLUSTERED BY

はい

ハッシュキーを指定します。MaxCompute は指定された列のハッシュ値を計算し、これらの値に基づいてデータをハッシュバケットに分散します。

MaxCompute は指定された列に対してハッシュ操作を実行し、ハッシュ値に基づいてデータをバケットに分散します。データスキューおよびホットスポットを防止し、良好な並列実行性能を実現するために、CLUSTERED BY 句には値の範囲が広く、重複キーが少ない列を選択してください。また、join 最適化のために、頻繁に使用される結合キーまたは集約キー(従来のデータベースにおけるプライマリキーに類似)も考慮してください。

SORTED BY

はい

各ハッシュバケット内の列のソート順を指定します。

最適なパフォーマンスを得るには、SORTED BYCLUSTERED BY に同じ列を使用してください。SORTED BY 句を指定すると、MaxCompute は自動的にインデックスを作成し、クエリの高速化に使用します。

number_of_buckets

はい

ハッシュバケットの数を指定します。

この値は必須であり、データ量に応じて決定されます。デフォルトでは、MaxCompute は最大 1,111 のリデューサをサポートしており、ハッシュバケット数は 1,111 に制限されます。set odps.stage.reducer.num =<concurrency>; コマンドを実行してこの制限を引き上げることができますが、値は 4,000 を超えることはできません。値が高すぎるとパフォーマンスが低下する可能性があります。

説明

ハッシュバケット数を選択する際は、以下の 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 外部テーブルの作成パラメーターを例として使用します。他のタイプの外部テーブルの作成パラメーターの詳細については、「外部テーブル」をご参照ください。

パラメーター

必須

説明

STORED AS '<file_format>'

はい

外部テーブルのデータ形式に基づいて file_format を指定します。

WITH SERDEPROPERTIES(options)

いいえ

外部テーブルの権限付与、圧縮、文字解析に関連するパラメーターを指定します。

oss_location

はい

外部テーブルデータの OSS ストレージ場所。詳細については、「OSS 外部テーブル」をご参照ください。

トランザクションテーブルおよび Delta テーブルのパラメーター

トランザクションテーブルおよび Delta テーブルのパラメーター

Delta テーブルのパラメーター

Delta テーブルは、ニアリアルタイムの読み取りおよび書き込み、増分ストレージおよびアクセス、リアルタイム更新をサポートするテーブル形式です。現在、プライマリキーを持つテーブルのみサポートされています。

パラメーター

必須

説明

備考

PRIMARY KEY(PK)

はい

Delta テーブルのプライマリキーを定義します。複数の列を含めることができます。

構文は標準 SQL のプライマリキー構文に従います。プライマリキー列は NOT NULL に設定する必要があり、変更できません。プライマリキーを設定すると、プライマリキー列に基づいてデータの重複排除が実行されます。一意性制約は、単一のパーティション内または非パーティション化テーブル内で適用されます。

transactional

はい

Delta テーブルを作成するために必須です。このパラメーターを true に設定する必要があります。

テーブルが MaxCompute ACID テーブルのトランザクションプロパティをサポートすることを示します。テーブルはマルチバージョン同時実行制御 (MVCC) モデルを使用して、スナップショット分離レベルを保証します。

write.bucket.num

いいえ

デフォルト値は 16 です。有効範囲は (0, 4096] です。

各パーティションまたは非パーティション化テーブルのバケット数を指定します。これは、データ書き込み時の同時実行ノード数も示します。パーティションテーブルの場合、このパラメーターを変更でき、新しい設定は新しいパーティションに適用されます。非パーティション化テーブルの場合、このパラメーターを変更することはできません。以下の推奨事項を考慮してください。

  • Tunnel を使用してデータをインポートする場合、このパラメーターは同時実行 Tunnel ノード数を指定します。この設定はインポートトラフィックに影響し、最大同時実行 Tunnel ノード数の制約も受けます。

  • SQL を使用してデータを書き込む場合、このパラメーターはリデューサの同時実行度を指定します。これは、最大同時実行リデューサノード数の制約を受けます。

  • 各バケットの推奨サイズは約 500 MB のデータです。たとえば、パーティションサイズが 500 GB と推定される場合、バケット数を 1,000 に設定します。非常に大きなテーブルの場合、バケットサイズを 2 GB ~ 3 GB に増やすことができます。

acid.data.retain.hours

いいえ

デフォルト値は 24 です。有効範囲は [24, 168] です。

タイムトラベルを使用して履歴データ状態をクエリできる時間範囲(時間単位)を指定します。168 時間(7 日)を超えるタイムトラベル履歴が必要な場合は、MaxCompute テクニカルサポートにお問い合わせください。

  • 値が 0 の場合、履歴データ状態は保持されず、タイムトラベルクエリはサポートされません。

  • 指定された値より古い履歴データは削除またはコンパクションされる可能性があります。

  • タイムトラベルクエリで、このパラメーターで定義された許容範囲よりも前の時間を指定すると、エラーが返されます。たとえば、この値が 72 の場合、72 時間以上前のデータをクエリすると失敗します。

acid.incremental.query.out.of.time.range.enabled

いいえ

デフォルト値:false

true の場合、増分クエリの endTimestamp はテーブルの最新データコミット時間よりも後にすることができます。この場合、新しいデータが挿入される可能性があるため、複数回のクエリで異なる結果が返されることがあります。このパラメーターの値は既存のテーブルに対して変更できます。

acid.write.precombine.field

いいえ

単一の列名を指定します。

列名を指定した場合、システムはプライマリキー列と組み合わせてこの列を使用し、同じコミット内でデータの重複排除を実行します。これにより、データの一意性と整合性が保証されます。

説明

単一のデータコミットが 128 MB を超える場合、複数のファイルが生成されます。このパラメーターは複数のファイル間では適用されません。

acid.partial.fields.update.enable

いいえ

true に設定すると、SQL または Tunnel を使用して Delta テーブルに対して部分列更新を実行できます。

このパラメーターはテーブル作成時に設定します。テーブル作成後には変更できません

  • Delta テーブルのその他のパラメーター要件:

    • LIFECYCLE:テーブルのライフサイクルはタイムトラベル保持期間以上である必要があります。つまり、lifecycle >= acid.data.retain.hours / 24 です。テーブル作成時にチェックが実行され、この条件を満たしていない場合はエラーが報告されます。

    • サポートされていない機能:CLUSTERED BYEXTERNAL、および CREATE TABLE AS はサポートされていません。

  • その他の制限事項:

    • 現在、他のエンジンは Delta テーブルを直接操作できません。MaxCompute SQL のみサポートされています。

    • 標準テーブルを Delta テーブルに変換することはできません。

    • Delta テーブルのプライマリキー列に対してスキーマ変更を実行することはできません。

トランザクションテーブルのパラメーター

パラメーター

必須

説明

TBLPROPERTIES("transactional"="true")

はい

テーブルをトランザクションテーブルとして設定します。その後、update および delete 操作を実行して、行レベルでデータを更新または削除できます。詳細については、「データの更新または削除 (UPDATE | DELETE)」をご参照ください。

トランザクションテーブルには以下の制限事項が適用されます。

  • 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 は読み取り操作のみサポートしています。

  • 重要なデータに対して updatedelete、または 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
    );

パーティションテーブル

  • 標準パーティションテーブルを作成します。

    CREATE TABLE IF NOT EXISTS sale_detail(
     shop_name     STRING,
     customer_id   STRING,
     total_price   DOUBLE)
    PARTITIONED BY (sale_date STRING, region STRING);
  • 時間ベースのデータ列に基づいてパーティションを生成する 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");

内部テーブル

  • 外部パーティションテーブルからデータをコピーして内部テーブルを作成します。内部テーブルにはパーティションプロパティが含まれません。

    1. 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    20241110
    2. DESC 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     |       |                                             |
      +------------------------------------------------------------------------------------+
  • 外部パーティションテーブルからスキーマをコピーして内部テーブルを作成します。内部テーブルにはパーティションプロパティが含まれます。

    1. 内部テーブル 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    c
    2. DESC 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;

その他の方法

既存のテーブルの置き換え

  1. 元のテーブル my_table を作成し、データを挿入します。

    CREATE OR REPLACE TABLE my_table(a BIGINT);
    
    INSERT INTO my_table(a) VALUES (1),(2),(3);
  2. OR REPLACE を使用して、同じ名前の新しいテーブルを作成し、列を変更します。

    CREATE OR REPLACE TABLE my_table(b STRING);
  3. 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 からデータをコピーし、ライフサイクルを設定して sale_detail_ctas1 という新しいテーブルを作成します。
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;

DROP TABLE

非パーティション化テーブルまたはパーティションテーブルを削除します。

注意事項

  • テーブルの削除は慎重に行ってください。削除されたテーブルは、プロジェクトでバックアップおよびリストア機能が有効になっており、かつテーブルが設定されたデータ保持期間内にある場合にのみ復元できます。詳細については、「ローカルバックアップ」をご参照ください。

  • テーブルを削除すると、MaxCompute プロジェクトのストレージ使用量が減少します。

構文

DROP TABLE [IF EXISTS] <table_name>; 

パラメーター

パラメーター

必須

説明

IF EXISTS

いいえ

IF EXISTS を指定しない場合、存在しないテーブルを削除しようとすると例外が返されます。IF EXISTS を指定した場合は、テーブルが存在しなくても文が成功します。

table_name

はい

削除するテーブルの名前です。

-- sale_detail テーブルを削除します。テーブルの存在有無にかかわらず、この文は成功します。
DROP TABLE IF EXISTS sale_detail; 

参考資料

  • テーブルデータを別のテーブルにコピーする方法については、「CLONE TABLE」をご参照ください。

  • テーブル情報の変更および表示方法については、「テーブルの変更および表示」をご参照ください。

  • 既存のテーブルパーティションの管理方法については、「パーティション操作」をご参照ください。

  • 既存のテーブル列の管理方法については、「列操作」をご参照ください。