このトピックでは、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 文を実行し、同じ名前のテーブルを置き換えとして作成できます。 | このパラメーターは、次のステートメントの代わりに使用できます。 説明 制限:CREATE OR REPLACE TABLE を次の構文と一緒に使用することはできません。
|
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 | いいえ | 列のデフォルト値。 |
説明
|
table_comment | いいえ | テーブルのコメント。 | コメントは、長さが 1,024 バイトを超えない有効な文字列である必要があります。このパラメーターの値が要件を満たしていない場合、エラーが返されます。 |
LIFECYCLE | いいえ | テーブルのライフサイクル。 | 値は正の整数である必要があります。単位:日。
|
パーティションテーブルのパラメーター
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 | いいえ | 生成されたパーティションキー列の名前。 パーティションキー列の名前を指定しない場合、システムはデフォルト名として | パーティション式を使用してパーティションが計算された後、計算結果に基づいて STRING 型のパーティションキー列が生成されます。列名を明示的に指定できます。列の型と列の値は直接操作できません。 |
TBLPROPERTIES('ingestion_time_partition'='true') | いいえ | データ書き込み時間に基づいてパーティションキー列を生成するかどうかを指定します。 | データ書き込み時間に基づいて自動パーティションテーブルを使用する方法の詳細については、「データ書き込み時間に基づく自動パーティションテーブル」をご参照ください。 |
クラスタテーブルのパラメーター
クラスタテーブルは、ハッシュクラスタテーブルと範囲クラスタテーブルに分類されます。
ハッシュクラスタテーブルのパラメーター
パラメーター | 必須 | 説明 | 備考 |
CLUSTERED BY | はい | ハッシュキー。 | MaxCompute は、指定された列に対してハッシュ操作を実行し、ハッシュ値に基づいて各バケットにデータを分散します。データスキューとホットスポットを防ぎ、より優れた並列実行パフォーマンスを実現するために、 |
SORTED BY | はい | バケット内のフィールドのソート方法を指定します。 | より良いパフォーマンスを実現するために、SORTED BY を CLUSTERED BY と同じ値に設定することをお勧めします。さらに、SORTED BY 句を指定すると、MaxCompute は自動的にインデックスを生成し、クエリ中にインデックスを使用して実行を高速化します。 |
number_of_buckets | はい | ハッシュバケットの数。 | このパラメーターは必須であり、このパラメーターの値はデータ量によって異なります。デフォルトでは、MaxCompute は最大 1,111 個のレデューサーをサポートしています。これは、MaxCompute が最大 1,111 個のハッシュバケットをサポートしていることを意味します。 |
最適なパフォーマンスを維持するために、ハッシュバケットの数を指定する際には、次のルールに注意することをお勧めします。
各ハッシュバケットのサイズを約 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 外部テーブルを作成するためのパラメーターを示しています。外部テーブルの作成方法の詳細については、「外部テーブル」をご参照ください。
パラメーター | 必須 | 説明 |
| はい | 外部テーブルのデータ形式に基づいて file_format を指定します。 |
| いいえ | 外部テーブルの承認、圧縮、文字解析に関連するパラメーター。 |
oss_location | はい | 外部テーブルデータの OSS ストレージの場所。詳細については、「OSS 外部テーブル」をご参照ください。 |
トランザクションテーブルと Delta テーブルのパラメーター
Delta テーブルのパラメーター
Delta テーブルは、ほぼリアルタイムの読み取りと書き込み、増分読み取りと書き込み、増分ストレージ、リアルタイム更新などの機能をサポートしています。プライマリキーを持つ Delta テーブルのみがサポートされています。
パラメーター | 必須 | 説明 | 備考 |
PRIMARY KEY(PK) | はい | このパラメーターは、Delta テーブルを作成するときに必須です。複数の列をプライマリキーとして指定できます。 | プライマリキーの標準 SQL 構文に準拠する必要があります。プライマリキーとして定義されている列は NULL 以外に設定する必要があり、変更することはできません。Delta テーブルにプライマリキーを指定すると、プライマリキーに基づいてテーブルから重複データが削除されます。プライマリキー列の一意性制約は、単一のパーティションまたは非パーティションテーブルで有効です。 |
transactional | はい | このパラメーターは、Delta テーブルを作成するときに必須です。このパラメーターを true に設定する必要があります。 | このプロパティを |
write.bucket.num | いいえ | デフォルト値:16。有効な値: | このパラメーターは、パーティションテーブルのパーティションまたは非パーティションテーブルのバケットの数を示します。このパラメーターは、データの書き込みに使用される同時ノードの数も指定します。パーティションテーブルのこのパラメーターの値を変更できます。パーティションテーブルに新しいパーティションが追加された場合、デフォルトでは、このパラメーターの構成が新しいパーティションに適用されます。非パーティションテーブルのこのパラメーターの値を変更することはできません。次の点に注意してください。
|
acid.data.retain.hours | いいえ | デフォルト値:24。有効な値: | タイムトラベル機能を使用して履歴データステータスをクエリできる時間範囲。単位:時間。168 時間 (7 日間) を超える期間の履歴データステータスをクエリするには、MaxCompute テクニカルサポートにお問い合わせください。
|
acid.incremental.query.out.of.time.range.enabled | いいえ | デフォルト値: | このパラメーターを true に設定すると、増分クエリで指定された endTimestamp プロパティの値を、テーブル内のデータの最大コミット時間よりも後の時点にすることができます。endTimestamp プロパティの値が現在の時刻よりも大きい場合、新しいデータが Delta テーブルに挿入される可能性があり、複数のクエリで異なる結果が得られる可能性があります。テーブルのこのパラメーターの値を変更できます。 |
acid.write.precombine.field | いいえ | このパラメーターを使用して、1 つの列の名前のみを指定できます。 | 列名を指定すると、システムはこのパラメーターと一緒にコミットされた SQL 文を含むファイル内のプライマリキー列に基づいてデータ重複除去を実行します。これにより、データの一意性と一貫性が確保されます。 説明 一度にコミットされるデータのサイズが 128 MB を超える場合、複数のファイルが生成されます。このパラメーターは、複数のファイルのデータ重複除去には使用できません。 |
acid.partial.fields.update.enable | いいえ | このパラメーターを | テーブルを作成するときにこのパラメーターを設定できます。テーブルの作成後、このパラメーターの値を変更することはできません。 |
Delta テーブルのその他の一般的なパラメーターの要件:
LIFECYCLE:テーブルのライフサイクルは、タイムトラベルクエリを実行できるライフサイクル以上である必要があります。式は
lifecycle >= acid.data.retain.hours / 24です。テーブルを作成するときに、MaxCompute は指定したテーブルのライフサイクルを確認します。指定されたライフサイクルが要件を満たしていない場合、エラーが返されます。その他のサポートされていない機能:Delta テーブルは、CLUSTER BY 文と CREATE TABLE AS 文をサポートしておらず、外部テーブルとして使用することはできません。
その他の制限:
MaxCompute SQL のみで Delta テーブルを直接操作できます。
既存の共通テーブルを Delta テーブルに変更することはできません。
Delta テーブルのプライマリキー列のスキーマを変更することはできません。
トランザクションテーブルのパラメーター
パラメーター | 必須 | 説明 |
TBLPROPERTIES(transactional"="true") | はい | このパラメーターは、テーブルをトランザクションテーブルに設定するために使用されます。トランザクションテーブルで |
トランザクションテーブルには、次の制限があります。
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) ジョブの場合、ジョブを使用してトランザクションテーブルからデータを読み取ることはできますが、ジョブを使用してトランザクションテーブルにデータを書き込むことはできません。
トランザクションテーブルの重要なデータに対して
update、delete、またはinsert overwrite操作を実行する前に、select+insert操作を使用して、データを別のテーブルに手動でバックアップする必要があります。
既存のテーブルに基づいてテーブルを作成するためのパラメーター
CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] AS <select_statement>;文を使用して、テーブルを作成し、新しいテーブルにデータを複製できます。ただし、ソーステーブルのパーティションプロパティとライフサイクルプロパティは、作成されたテーブルに複製されません。ソーステーブルのパーティションキー列は、作成されたテーブルでは共通列と見なされます。
lifecycle パラメーターを使用してテーブルを再利用することもできます。このステートメントを実行して、内部テーブルを作成し、外部テーブルのデータを内部テーブルに複製することもできます。
CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] LIKE <existing_table_name>;文を使用して、既存のテーブルと同じスキーマを使用するテーブルを作成できます。ただし、このステートメントを使用して作成されたテーブルは、ソーステーブルのデータまたはライフサイクルプロパティを複製しません。
lifecycle パラメーターを使用してテーブルを再利用することもできます。このステートメントを実行して、既存の外部テーブルと同じスキーマを持つ内部テーブルを作成することもできます。
例
非パーティションテーブルを作成する
非パーティションテーブルを作成します。
CREATE TABLE test1 (key STRING);非パーティションテーブルを作成し、テーブルフィールドのデフォルト値を構成します。
CREATE TABLE test_default( tinyint_name tinyint NOT NULL default 1Y, smallint_name SMALLINT NOT NULL DEFAULT 1S, int_name INT NOT NULL DEFAULT 1, bigint_name BIGINT NOT NULL DEFAULT 1, binary_name BINARY , float_name FLOAT , double_name DOUBLE NOT NULL DEFAULT 0.1, decimal_name DECIMAL(2, 1) NOT NULL DEFAULT 0.0BD, varchar_name VARCHAR(10) , char_name CHAR(2) , string_name STRING NOT NULL DEFAULT 'N', boolean_name BOOLEAN NOT NULL DEFAULT TRUE );
パーティションテーブルを作成する
AUTO PARTITION テーブルを作成し、時間計算関数を使用して時間型データ列に基づいてパーティションを生成します。
-- sale_date 列を月ごとに切り捨てて、sale_month という名前のパーティション列を生成し、このパーティション列に基づいてテーブルをパーティション分割します。 CREATE TABLE IF NOT EXISTS auto_sale_detail( shop_name STRING, customer_id STRING, total_price DOUBLE, sale_date DATE ) AUTO PARTITIONED BY (TRUNC_TIME(sale_date, 'month') AS sale_month);AUTO PARTITION テーブルを作成し、データ書き込み時間に基づいてパーティションが生成されるように指定します。この場合、システムは MaxCompute にデータが書き込まれた時間を自動的に取得し、時間計算関数を使用してパーティションを生成します。
-- テーブルの作成後、テーブルにデータが書き込まれると、システムはデータ書き込み時間 _partitiontime を自動的に取得し、日ごとに切り捨てて、sale_date という名前のパーティション列を生成し、このパーティション列に基づいてテーブルをパーティション分割します。 CREATE TABLE IF NOT EXISTS auto_sale_detail2( shop_name STRING, customer_id STRING, total_price DOUBLE, _partitiontime TIMESTAMP_NTZ) AUTO PARTITIONED BY (TRUNC_TIME(_partitiontime, 'day') AS sale_date) TBLPROPERTIES('ingestion_time_partition'='true');
新しいテーブルを作成する
既存のテーブルを置き換えるテーブルを作成します。
元のテーブル
mytableを作成し、テーブルにデータを書き込みます。CREATE OR REPLACE TABLE my_table(a BIGINT); INSERT INTO my_table(a) VALUES (1),(2),(3);OR REPLACE を使用して同じ名前のテーブルを作成し、テーブルフィールドを変更します。
CREATE OR REPLACE TABLE my_table(b STRING);my_tableテーブルをクエリします。次のコードは、返された結果を示しています。+------------+ | b | +------------+ +------------+
次の SQL 文は無効です。
CREATE OR REPLACE TABLE IF NOT EXISTS my_table(b STRING); CREATE OR REPLACE TABLE my_table AS SELECT; CREATE OR REPLACE TABLE my_table LIKE newtable;テーブルを作成し、既存のテーブルから新しいテーブルにデータを複製し、新しいテーブルのライフサイクルを構成します。
-- sale_detail_ctas1 という名前のテーブルを作成し、sale_detail テーブルから 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");
内部テーブルを作成する
内部テーブルを作成し、パーティション外部テーブルのデータを内部テーブルに複製します。パーティションプロパティは内部テーブルに複製されません。
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 20241110DESC 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 | | | +------------------------------------------------------------------------------------+
内部テーブルを作成し、パーティション外部テーブルのデータを内部テーブルに複製します。パーティションプロパティは内部テーブルに複製されます。
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 cDESC from_exetbl_like;を実行して、内部テーブルの構造をクエリします。次の情報が返されます。+------------------------------------------------------------------------------------+ | Owner: ALIYUN$************ | | Project: ***_*****_*** | | TableComment: | +------------------------------------------------------------------------------------+ | CreateTime: 2023-01-10 15:09:47 | | LastDDLTime: 2023-01-10 15:09:47 | | LastModifiedTime: 2023-01-10 15:09:47 | +------------------------------------------------------------------------------------+ | InternalTable: YES | Size: 0 | +------------------------------------------------------------------------------------+ | Native Columns: | +------------------------------------------------------------------------------------+ | Field | Type | Label | Comment | +------------------------------------------------------------------------------------+ | a | string | | | | b | string | | | +------------------------------------------------------------------------------------+ | Partition Columns: | +------------------------------------------------------------------------------------+ | c | string | | +------------------------------------------------------------------------------------+
Delta テーブルを作成する
Delta テーブルを作成します。
CREATE TABLE mf_tt (pk BIGINT NOT NULL PRIMARY KEY, val BIGINT) TBLPROPERTIES ("transactional"="true");Delta テーブルを作成し、メインテーブルプロパティを構成します。
CREATE TABLE mf_tt2 ( pk BIGINT NOT NULL, pk2 BIGINT NOT NULL, val BIGINT, val2 BIGINT, PRIMARY KEY (pk, pk2) ) TBLPROPERTIES ( "transactional"="true", "write.bucket.num" = "64", "acid.data.retain.hours"="120" ) LIFECYCLE 7;
テーブルを削除する
非パーティションテーブルまたはパーティションテーブルを削除します。
注意事項
テーブルを削除する前に、テーブルを削除できることを確認してください。慎重に進んでください。誤ってテーブルを削除した場合、プロジェクトでバックアップと復元機能が有効になっており、テーブルがプロジェクトに指定されたバックアップデータの保持期間内に削除されていれば、テーブルを復元できます。バックアップと復元の詳細については、「ローカルバックアップ」をご参照ください。
テーブルを削除すると、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」をご参照ください。
テーブル情報を変更および表示する方法の詳細については、「テーブルの変更と表示」をご参照ください。
既存のテーブルのパーティションに対する操作を実行する方法の詳細については、「パーティション操作」をご参照ください。
既存のテーブルの列に対する操作を実行する方法の詳細については、「列操作」をご参照ください。