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

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

最終更新日:Mar 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

      • CREATE TABLE ... AS SELECT

      • CREATE TABLE ... LIKE

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

    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 バイト以下で、英字、数字、アンダースコア (_), または漢字のみを含む必要があります。大文字小文字は区別されません。先頭を英字で始めることが推奨されます。

    • BigQuery 互換モードを有効にするには、SET odps.sql.bigquery.compatible=true; コマンドを実行します。このモードでは、列名の長さは最大 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 バイト以下で、英字、数字、アンダースコア (_), または漢字のみを含む必要があります。大文字小文字は区別されません。先頭を英字で始めることが推奨されます。

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

    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

    いいえ

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

    名前が指定されていない場合、システムはデフォルトで _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 の reducer をサポートしており、これによりハッシュバケット数の上限が 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 を使用してデータを書き込む場合、このパラメーターは reducer の同時実行度を指定します。これは、最大同時 reducer ノード数にも制約されます。

    • 各バケットの推奨サイズは約 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 Table に対して部分的な列の更新を実行できます。

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

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

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

      • サポートされていない機能:CLUSTERED BYEXTERNALCREATE 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");

    内部テーブル

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

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

      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_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;

    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」をご参照ください。

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

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

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