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

MaxCompute:CREATE TABLE

最終更新日:Sep 18, 2025

このトピックでは、非パーティションテーブル、パーティションテーブル、外部テーブル、またはクラスター化テーブルを作成する方法について説明します。

制限事項

  • パーティションテーブルには、最大 6 レベルのパーティションを設定できます。たとえば、テーブルがパーティションキー列として日付列を使用する場合、パーティションの 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>], ...)]
;

クラスター化テーブルの作成

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

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 構文に準拠する必要があります。プライマリキーとして定義された列は not 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 のいずれかの方法でのみ指定できます。

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 のいずれかの方法でのみ指定できます。

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 個の reducer をサポートします。これは、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 個のハッシュバケットがあります。ハッシュバケットの数として 2n (512、1,024、2,048、4,096 など) を使用することをお勧めします。これにより、システムはハッシュバケットを自動的に分割およびマージし、シャッフルとソートのステップを削除して実行効率を向上させることができます。

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

パラメーター

必須

説明

備考

RANGE CLUSTERED BY

はい

レンジクラスター化列。

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

SORTED BY

はい

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

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

number_of_buckets

はい

ハッシュバケットの数。

レンジクラスター化テーブルのバケット数は、ハッシュクラスター化テーブルの 2n のベストプラクティスに従う必要はありません。データ分布が妥当であれば、任意の数のバケットを使用できます。レンジクラスター化テーブルでバケット数を指定しない場合、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 構文に準拠する必要があります。プライマリキーとして定義された列は not null に設定する必要があり、変更できません。Delta テーブルにプライマリキーを指定すると、プライマリキーに基づいてテーブルから重複データが削除されます。プライマリキー列の一意性制約は、単一のパーティションまたは非パーティションテーブルで有効です。

transactional

はい

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

このプロパティを true に設定すると、テーブルが ACID (原子性、一貫性、隔離性、耐久性) トランザクションをサポートすることを示します。Multi-Version Concurrency Control (MVCC) モデルを使用して、スナップショットの隔離性を提供します。

write.bucket.num

いいえ

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

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

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

  • SQL 文を使用してデータが書き込まれる場合、このパラメーターの値はデータの書き込みに使用される reducer の同時実行数を指定します。この設定は、同時 reducer ノードの最大数の影響を受けます。

  • 各バケットに約 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);

パーティションテーブルの作成

sale_detail という名前のパーティションテーブルを作成します。

CREATE TABLE IF NOT EXISTS sale_detail(
 shop_name     STRING,
 customer_id   STRING,
 total_price   DOUBLE)
PARTITIONED BY (sale_date STRING, region STRING);

元のテーブルを置き換える新しいテーブルの作成

  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 テーブルのスキーマと同一です。ただし、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");

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;

非パーティションテーブルを作成し、フィールドのデフォルト値を指定する

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

内部テーブルを作成し、外部パーティションテーブルからデータを複製する

  • 内部テーブルにはパーティションプロパティが含まれていません。

    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     |                                                     |
      +------------------------------------------------------------------------------------+

関連コマンド

  • ALTER TABLE: テーブル操作を変更します。

  • TRUNCATE: 指定したテーブルからデータをクリアします。

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

  • DESC TABLE/VIEW: MaxCompute 内部テーブル、ビュー、マテリアライズドビュー、外部テーブル、クラスター化テーブル、およびトランザクションテーブルに関する情報を取得します。

  • SHOW: テーブルの SQL DDL 文を取得したり、プロジェクト内のすべてのテーブルとビューを一覧表示したり、テーブル内のすべてのパーティションを一覧表示したりします。