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

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

最終更新日:Aug 19, 2025

このトピックでは、SQL 文を使用してテーブルを作成および削除する方法について説明します。

種類

機能

ロール

実行環境

テーブルを作成する

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

プロジェクトに対する CreateTable 権限を持つユーザー。

次のプラットフォームでステートメントを実行できます。

テーブルを削除する

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

テーブルに対する DROP 権限を持つユーザー

テーブルを作成する

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

制限

  • パーティションテーブルには、最大 6 レベルのパーティションを設定できます。たとえば、テーブルがパーティションキー列として日付を使用する場合、パーティションレベルは year/month/week/day/hour/minute となります。

  • デフォルトでは、テーブルには最大 60,000 個のパーティションを設定できます。必要に応じて、テーブル内のパーティションの最大数を調整できます。

テーブルの制限の詳細については、「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>';
  • テーブルを作成し、テーブルタイプを指定します。

    • トランザクションテーブルを作成します。テーブルの作成後、テーブルのデータを更新または削除できます。ただし、トランザクションテーブルには特定の制限が課せられます。必要に応じてトランザクションテーブルを作成することをお勧めします。

      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>]
      [TBLPROPERTIES ("transactional"="true" 
      [, "write.bucket.num" = "N", "acid.data.retain.hours"="hours"...])] [LIFECYCLE <days>];
  • 既存のテーブルに基づいてテーブルを作成します。

    • 既存のテーブルに基づいてテーブルを作成し、既存のテーブルから新しいテーブルにデータを複製します。パーティションのプロパティは複製されません。データレイクハウスソリューションを実装するために使用される既存の外部テーブルまたは外部プロジェクトの既存のテーブルに基づいてテーブルを作成できます。

      CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] AS <select_statement>;
    • 既存のテーブルと同じスキーマを持つテーブルを作成します。既存のテーブルのデータは複製されません。データレイクハウスソリューションを実装するために使用される既存の外部テーブルまたは外部プロジェクトの既存のテーブルに基づいてテーブルを作成できます。

      CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] LIKE <existing_table_name>;

パラメーター

共通パラメーター

パラメーター

必須

説明

備考

OR REPLACE

いいえ

<table_name> で指定されたテーブルがすでに存在する場合、そのテーブルに対して DROP TABLE 文を実行し、同じ名前のテーブルを置き換えとして作成できます。

このパラメーターは、次のステートメントの代わりに使用できます。

DROP TABLE IF EXISTS <tableName>;  -- 宛先テーブルが存在する場合は、最初に削除します。
CREATE TABLE <tableName> ...;      -- テーブルを作成します。
説明

制限:CREATE OR REPLACE TABLE を次の構文と一緒に使用することはできません。

  • CREATE TABLE ... IF NOT EXISTS.

  • CREATE TABLE ... AS SELECT.

  • CREATE TABLE ... LIKE.

EXTERNAL

いいえ

作成するテーブルが外部テーブルであることを指定します。

なし

IF NOT EXISTS

いいえ

同じ名前のテーブルがすでに存在する場合にエラーがスローされるのを防ぎます。テーブルが存在する場合、ステートメントは無視されます。

IF NOT EXISTS パラメーターを指定せず、同じ名前のテーブルが存在する場合、エラーが返されます。IF NOT EXISTS パラメーターを指定すると、既存のテーブルのスキーマが作成するテーブルのスキーマと同じかどうかに関係なく、成功メッセージが返されます。既存のテーブルのメタデータは変更されません。

table_name

はい

テーブルの名前。

名前は大文字と小文字を区別せず、文字、数字、アンダースコア (_) のみを含めることができます。名前は文字で始めることをお勧めします。名前の長さは 128 バイトを超えることはできません。超えると、エラーが返されます。

PRIMARY KEY(pk)

いいえ

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

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

重要

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

col_name

はい

テーブル列の名前。

名前は大文字と小文字を区別せず、文字、数字、アンダースコア (_) のみを含めることができます。名前は文字で始めることをお勧めします。名前の長さは 128 バイトを超えることはできません。超えると、エラーが返されます。

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

いいえ

テーブルのライフサイクル。

値は正の整数である必要があります。単位:日。

  • 非パーティションテーブル:ライフサイクルは、テーブルデータが最後に変更された時刻から計算されます。指定された日数 (days) が経過した後もテーブルデータが変更されない場合、MaxCompute はテーブルを自動的に再利用します (DROP TABLE 操作と同様)。

  • パーティションテーブル:MaxCompute は、LastModifiedTime の値に基づいてパーティションを再利用するかどうかを判断します。非パーティションテーブルとは異なり、パーティションテーブルは、すべてのパーティションが再利用された場合でも削除されません。テーブルのライフサイクルは構成できますが、パーティションのライフサイクルは構成できません。

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

MaxCompute は、通常のパーティションテーブルと自動パーティションテーブル (AUTO PARTITION) という 2 種類のパーティションテーブルをサポートしています。さまざまなシナリオでのパーティションキー列の生成方法に基づいて、タイプを選択できます。

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

パラメーター

必須

説明

備考

PARTITIONED BY

はい

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

PARTITIONED BY または AUTO PARTITIONED BY のいずれか 1 つの方法のみを使用してパーティションを指定できます。

col_name

はい

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

名前は大文字と小文字を区別せず、文字、数字、アンダースコア (_) のみを含めることができます。名前は文字で始めることをお勧めします。名前の長さは 128 バイトを超えることはできません。超えると、エラーが返されます。

data_type

はい

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

MaxCompute V1.0 データ型エディションでは、パーティションキー列は STRING 型である必要があります。MaxCompute V2.0 データ型エディションでは、パーティションキー列は TINYINT、SMALLINT、INT、BIGINT、VARCHAR、または STRING 型です。詳細については、「データ型エディション」をご参照ください。パーティションフィールドを使用してテーブルをパーティション分割する場合、パーティションの追加、パーティションデータの更新、またはパーティションデータの読み取り時に、全表スキャンは必要ありません。これにより、データ処理の効率が向上します。

col_comment

いいえ

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

コメントは、長さが 1,024 バイトを超えない有効な文字列である必要があります。このパラメーターの値が要件を満たしていない場合、エラーが返されます。

説明

パーティションキー列の値には、中国語などの 2 バイト文字を含めることはできません。パーティションキー列の値は文字で始める必要があり、文字、数字、およびサポートされている特殊文字を含めることができます。長さは 255 バイトを超えることはできません。サポートされている特殊文字には、スペース、コロン (:)、アンダースコア (_)、ドル記号 ($)、番号記号 (#)、ピリオド (.)、感嘆符 (!)、アットマーク (@) が含まれます。その他の文字(エスケープ文字 \t\n/ など)の動作は未定義です。

AUTO PARTITION テーブルのパラメーター

自動パーティションテーブル (AUTO PARTITION) は、特定の方法でパーティションキー列を自動的に生成できます。

パラメーター

必須

説明

備考

AUTO PARTITIONED BY

はい

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

PARTITIONED BY または AUTO PARTITIONED BY のいずれか 1 つの方法のみを使用してパーティションを指定できます。

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 は、指定された列に対してハッシュ操作を実行し、ハッシュ値に基づいて各バケットにデータを分散します。データスキューとホットスポットを防ぎ、より優れた並列実行パフォーマンスを実現するために、CLUSTERED BY 句では、値の範囲が広く、重複するキー値が少ない列を選択します。さらに、join 操作を最適化するために、従来のデータベースのプライマリキーと同様に、一般的に使用される結合キーまたは集約キーを選択することも検討する必要があります。

SORTED BY

はい

バケット内のフィールドのソート方法を指定します。

より良いパフォーマンスを実現するために、SORTED BYCLUSTERED BY と同じ値に設定することをお勧めします。さらに、SORTED BY 句を指定すると、MaxCompute は自動的にインデックスを生成し、クエリ中にインデックスを使用して実行を高速化します。

number_of_buckets

はい

ハッシュバケットの数。

このパラメーターは必須であり、このパラメーターの値はデータ量によって異なります。デフォルトでは、MaxCompute は最大 1,111 個のレデューサーをサポートしています。これは、MaxCompute が最大 1,111 個のハッシュバケットをサポートしていることを意味します。set odps.stage.reducer.num =<concurrency>; を使用して、この制限を増やすことができます。ただし、最大値は 4,000 です。それ以外の場合、パフォーマンスに影響します。

説明

最適なパフォーマンスを維持するために、ハッシュバケットの数を指定する際には、次のルールに注意することをお勧めします。

  • 各ハッシュバケットのサイズを約 500 MB に保ちます。たとえば、パーティションサイズが 500 GB の場合、1,000 個のバケットを指定することをお勧めします。こうすることで、各バケットのサイズは平均 500 MB になります。テーブルに大量のデータが含まれている場合は、各バケットのサイズを 500 MB から 2 GB ~ 3 GB の範囲のサイズに増やすことができます。set odps.stage.reducer.num=<concurrency>; を使用して、1,111 バケットの制限を超えることもできます。

  • join 最適化シナリオでは、シャッフルとソートのステップを削除することで、パフォーマンスを大幅に向上させることができます。したがって、テーブルのハッシュバケットの数は、他のテーブルのハッシュバケットの数の倍数である必要があります。たとえば、一方のテーブルに 256 個のハッシュバケットがあり、もう一方のテーブルに 512 個のハッシュバケットがあるとします。ハッシュバケットの数として 2 の n 乗 (512、1,024、2,048、4,096 など) を使用することをお勧めします。こうすることで、システムはハッシュバケットを自動的に分割およびマージし、シャッフルとソートのステップを削除して実行効率を向上させることができます。

範囲クラスタテーブルのパラメーター

パラメーター

必須

説明

備考

RANGE CLUSTERED BY

はい

範囲クラスタ列。

MaxCompute は、指定された列に対してバケット操作を実行し、バケット ID に基づいて各バケットにデータを分散します。

SORTED BY

はい

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

このパラメーターは、ハッシュクラスタテーブルの場合と同じ方法で使用できます。

number_of_buckets

はい

ハッシュバケットの数。

範囲クラスタテーブルのバケットの数は、ハッシュクラスタテーブルの 2 の n 乗のベストプラクティスに従う必要はありません。データ分散が合理的であれば、任意のバケット数を使用できます。範囲クラスタテーブルのバケットの数を指定しない場合、MaxCompute はデータ量に基づいて最適な数を自動的に決定します。

範囲クラスタテーブルに対して JOIN 操作と AGGREGATE 操作を実行し、結合キーまたはグループキーが範囲クラスタキーまたは範囲クラスタキーのプレフィックスである場合、フラグを管理してシャッフルを無効にすることができます。これにより、実行効率が向上します。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 構文に準拠する必要があります。プライマリキーとして定義されている列は NULL 以外に設定する必要があり、変更することはできません。Delta テーブルにプライマリキーを指定すると、プライマリキーに基づいてテーブルから重複データが削除されます。プライマリキー列の一意性制約は、単一のパーティションまたは非パーティションテーブルで有効です。

transactional

はい

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

このプロパティを true に設定すると、テーブルは ACID (原子性、一貫性、分離性、耐久性) トランザクションをサポートします。マルチバージョン同時実行制御 (MVCC) モデルを使用して、スナップショット分離を提供します。

write.bucket.num

いいえ

デフォルト値:16。有効な値:(0, 4096]

このパラメーターは、パーティションテーブルのパーティションまたは非パーティションテーブルのバケットの数を示します。このパラメーターは、データの書き込みに使用される同時ノードの数も指定します。パーティションテーブルのこのパラメーターの値を変更できます。パーティションテーブルに新しいパーティションが追加された場合、デフォルトでは、このパラメーターの構成が新しいパーティションに適用されます。非パーティションテーブルのこのパラメーターの値を変更することはできません。次の点に注意してください。

  • MaxCompute トンネルを使用してデータを書き込む場合、このパラメーターの値は、データの書き込みに使用される同時ノードの数を指定します。パラメーターの設定はインポートトラフィックに影響し、トンネル内の同時ノードの最大数にも影響します。

  • SQL 文を使用してデータを書き込む場合、このパラメーターの値は、データの書き込みに使用されるレデューサーの同時実行性を指定します。設定は、同時実行レデューサーノードの最大数に従います。

  • 各バケットに約 500 MB のデータを書き込むことをお勧めします。たとえば、パーティションサイズが 500 GB の場合、1,000 個のハッシュバケットを追加することをお勧めします。こうすることで、各ハッシュバケットのサイズは平均 500 MB になります。テーブルに大量のデータが含まれている場合は、各ハッシュバケットのサイズを 500 MB から 2 GB ~ 3 GB の範囲のサイズに増やすことができます。

acid.data.retain.hours

いいえ

デフォルト値:24。有効な値:[24, 168]

タイムトラベル機能を使用して履歴データステータスをクエリできる時間範囲。単位:時間。168 時間 (7 日間) を超える期間の履歴データステータスをクエリするには、MaxCompute テクニカルサポートにお問い合わせください。

  • このパラメーターを 0 に設定すると、履歴データステータスは保持されず、タイムトラベルクエリはサポートされません。

  • 履歴データステータスがこのパラメーターで指定された範囲内にない期間保持されている場合、データは削除される可能性があります。compact メソッドを使用して、データが占有している領域を再利用できます。

  • このパラメーターで指定された時間範囲よりも前に生成されたデータに対して SQL タイムトラベルクエリを実行すると、エラーが返されます。たとえば、このパラメーターの値が 72 で、72 時間前の履歴データステータスをクエリするためにタイムトラベルクエリが実行された場合、エラーが返されます。

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

いいえ

デフォルト値:false

このパラメーターを true に設定すると、増分クエリで指定された endTimestamp プロパティの値を、テーブル内のデータの最大コミット時間よりも後の時点にすることができます。endTimestamp プロパティの値が現在の時刻よりも大きい場合、新しいデータが Delta テーブルに挿入される可能性があり、複数のクエリで異なる結果が得られる可能性があります。テーブルのこのパラメーターの値を変更できます。

acid.write.precombine.field

いいえ

このパラメーターを使用して、1 つの列の名前のみを指定できます。

列名を指定すると、システムはこのパラメーターと一緒にコミットされた SQL 文を含むファイル内のプライマリキー列に基づいてデータ重複除去を実行します。これにより、データの一意性と一貫性が確保されます。

説明

一度にコミットされるデータのサイズが 128 MB を超える場合、複数のファイルが生成されます。このパラメーターは、複数のファイルのデータ重複除去には使用できません。

acid.partial.fields.update.enable

いいえ

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

テーブルを作成するときにこのパラメーターを設定できます。テーブルの作成後、このパラメーターの値を変更することはできません

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

    • LIFECYCLE:テーブルのライフサイクルは、タイムトラベルクエリを実行できるライフサイクル以上である必要があります。式は lifecycle >= acid.data.retain.hours / 24 です。テーブルを作成するときに、MaxCompute は指定したテーブルのライフサイクルを確認します。指定されたライフサイクルが要件を満たしていない場合、エラーが返されます。

    • その他のサポートされていない機能:Delta テーブルは、CLUSTER BY 文と CREATE TABLE AS 文をサポートしておらず、外部テーブルとして使用することはできません。

  • その他の制限:

    • MaxCompute SQL のみで Delta テーブルを直接操作できます。

    • 既存の共通テーブルを Delta テーブルに変更することはできません。

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

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

パラメーター

必須

説明

TBLPROPERTIES(transactional"="true")

はい

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

トランザクションテーブルには、次の制限があります。

  • MaxCompute では、テーブルを作成するときにのみ、テーブルをトランザクションテーブルに設定できます。ALTER TABLE 文を使用して、既存のテーブルをトランザクションテーブルに変更することはできません。次のステートメントを実行すると、エラーが返されます。

    ALTER TABLE not_txn_tbl SET TBLPROPERTIES("transactional"="true");
    --エラーが返されます。
    FAILED: Catalog Service Failed, ErrorCode: 151, Error Message: Set transactional is not supported
  • クラスタテーブルまたは外部テーブルを作成する場合、トランザクションテーブルに設定することはできません。

  • トランザクションテーブルと MaxCompute 内部テーブル、外部テーブル、またはクラスタテーブルの間で変換することはできません。

  • トランザクションテーブルファイルは自動的にマージできないため、手動でマージ操作を実行する必要があります。詳細については、「トランザクションテーブルファイルをマージする」をご参照ください。

  • merge partition 操作はサポートされていません。

  • 他のシステムのジョブからトランザクションテーブルへのアクセスには、特定の制限が課せられます。たとえば、ジョブが Graph ジョブの場合、ジョブを使用してトランザクションテーブルからデータを読み取ったり、トランザクションテーブルにデータを書き込んだりすることはできません。ジョブが Spark ジョブまたは Platform for AI (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');

新しいテーブルを作成する

  • 既存のテーブルを置き換えるテーブルを作成します。

    1. 元のテーブル mytable を作成し、テーブルにデータを書き込みます。

      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 テーブルから 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 句で定数を列値として使用します。

    説明

    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 テーブルのスキーマと同じです。2 つのテーブルは、ライフサイクルを除いて、列名、列コメント、テーブルコメントなどのプロパティが同じです。ただし、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;

ハッシュクラスタテーブルまたは範囲クラスタテーブルを作成する

  • ハッシュクラスタ非パーティションテーブルを作成します。

    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 内部テーブルを作成します。

      -- 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_as_par; を実行して、内部テーブルの構造をクエリします。次の情報が返されます。

      +------------------------------------------------------------------------------------+
      | 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 からデータレイクハウス外部テーブルをクエリします。
      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;

テーブルを削除する

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

注意事項

  • テーブルを削除する前に、テーブルを削除できることを確認してください。慎重に進んでください。誤ってテーブルを削除した場合、プロジェクトでバックアップと復元機能が有効になっており、テーブルがプロジェクトに指定されたバックアップデータの保持期間内に削除されていれば、テーブルを復元できます。バックアップと復元の詳細については、「ローカルバックアップ」をご参照ください。

  • テーブルを削除すると、MaxCompute プロジェクトに保存されているデータの量が減少します。

構文

DROP TABLE [IF EXISTS] <table_name>; 

パラメーター

パラメーター

必須

説明

IF EXISTS

いいえ

IF EXISTS パラメーターを指定せず、テーブルが存在しない場合、エラーが返されます。IF EXISTS パラメーターを指定すると、テーブルが存在するかどうかに関係なく、成功メッセージが返されます。

table_name

はい

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

--sale_detail テーブルを削除します。sale_detail テーブルが存在するかどうかに関係なく、成功メッセージが返されます。
DROP TABLE IF EXISTS sale_detail; 

関連情報

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

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

  • 既存のテーブルのパーティションに対する操作を実行する方法の詳細については、「パーティション操作」をご参照ください。

  • 既存のテーブルの列に対する操作を実行する方法の詳細については、「列操作」をご参照ください。