ここでは、クライアントからテーブルを作成、表示、削除する方法を説明します。また、テーブル名やテーブル情報の変更方法についても説明します。
テーブルの作成
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[STORED BY StorageHandler] -- Limited to external tables
[WITH SERDEPROPERTIES (Options)] -- Limited to external tables
[LOCATION OSSLocation];-- Limited to external tables
[LIFECYCLE days]
[As select_statement]
CREATE TABLE [IF NOT EXISTS] table_name
LIKE existing_table_name
- テーブルの作成時に "if not exists" オプションを指定せず、同じ名前のテーブルが既に存在する場合は、エラーが返されます。 "if not exists" オプションを指定すると、同じ名前のテーブルが存在するかどうかにかかわらず、またソーステーブル構造とターゲットテーブル構造が異なっていても、すべての操作は正常に終了します。 既存のテーブルのメタ情報は変わりません。
- テーブル名と列名はどちらも大文字と小文字が区別されず、特殊文字を含めることはできません。 英字で始まる必要があり、a から z、A から Z、数字、およびアンダースコア (_) を含めることができます。 名前の長さは 128 バイトを超えることはできません。
- 1 つのテーブルに 1200 列を定義できます。
- データ型は、Bigint、Double、Boolean、Datetime、Decimal、String を使用できます。MaxCompute2.0 では、サポート対象のデータ型が増えました。
注 SQL 文の実行時に、Tinyint、Smallint、Int、Float、Varchar、TIMESTAMP BINARY などのデータ型が含まれている場合は、
set odps.sql.type.system.odps2=true;
を SQL 文の前に追加する必要があります。 set 文と SQL 文は同時に送信されます。 - パーティションを指定するには、Partitioned by を使用します。現在サポート対象のデータ型は、Tinyint、Smallint、Int、Bigint、Varchar、String
です。
パーティション値に 2 バイト文字 (例: 中国語) を使用することはできません。先頭は大文字または小文字で始め、続いて文字または数字を使用します。 名前の長さは 128 バイトを超えることはできません。 スペース、コロン (:)、アンダースコア (_)、ドル記号 ($)、シャープ記号 (#)、ピリオド (.)、感嘆符 (!)、'@' などの特殊文字を使用できます。 (\t)、(\n)、(/) などの文字は、未定義文字とみなされます。 パーティションテーブルでパーティションフィールドを使用すると、パーティション内のデータを追加、更新、および読み取る際に全テーブルスキャンを実行する必要がなくなり、処理効率が向上します。
- 現在、テーブルには 60,000 のパーティションを作成できます。パーティション階層は、6 レベルまでにする必要があります。
- コメントの内容は、有効な文字列で、1024 バイト以内にする必要があります。
- ライフサイクルはテーブルのライフサイクルを示し、単位は '日' です。 create table like 文では、ソーステーブルからライフサイクルの属性はコピーされません。
- 外部テーブルの詳細については、「OSS へのアクセス (Access OSS)」をご参照ください。
例:
create table if not exists sale_detail(
(
shop_name string,
customer_id string,
total_price double)
)
partitioned by (sale_date string,region string);
-- パーティションテーブル sale_detail を作成します。
create table...as select ...
文を使用してテーブルを作成することもできます。 テーブルを作成した後、データは次のように新しいテーブルにコピーされます。create table sale_detail_ctas1 as
select * from sale_detail;
create table...as select...
文でテーブルを作成すると、パーティション属性はコピーされません。 ソーステーブルのパーティション列は、オブジェクトテーブルの通常の列になります。 つまり、sale_detail_ctas1
は 5 列の非パーティションテーブルです。
create table ...
文で、Select 句の列値として定数を使用する場合は、次のように列名を指定することを推奨します。create table sale_detail_ctas2 as
select shop_name,
customer_id,
total_price,
'2013' as sale_date,
'China' as region
from sale_detail;
create table sale_detail_ctas3 as
select shop_name,
customer_id,
total_price,
'2013',
'China'
from sale_detail;
作成されたテーブル sale_detail_ctas3 の 4 番目の列と 5 番目の列は、_c3
、_c4
のような、システムで生成した名前になります。
create table … like’
文を使用します。create table sale_detail_like like sale_detail;
これで、sale_detail_like
のテーブル構造は、sale_detail
のテーブル構造とまったく同じになります。 ライフサイクルを除き、2 つのテーブルの属性 (列名、列コメント、テーブルコメントなど) は同じです。 しかし、sale_detail
のデータをテーブル sale_detail_like
にコピーすることはできません。
テーブル情報の表示
desc <table_name>;
desc extended <table_name>; --View external table information.
- 前述のテーブル sale_detail の情報を表示するには、次の文を実行します。
desc sale_detail;
返される情報:odps@ $odps_project>desc sale_detail; +--------------------------------------------------------------------+ | Owner: ALIYUN$lili.ll@alibaba-inc.com | Project: $odps_project | | TableComment: | +--------------------------------------------------------------------+ | CreateTime: 2017-06-28 15:05:17 | | LastDDLTime: 2017-06-28 15:05:17 | | LastModifiedTime: 2017-06-28 15:05:17 | +--------------------------------------------------------------------+ | InternalTable: YES | Size: 0 | +--------------------------------------------------------------------+ | Native Columns: | +--------------------------------------------------------------------+ | Field | Type | Label | Comment | +--------------------------------------------------------------------+ | shop_name | string | | | | customer_id | string | | | | total_price | double | | | +--------------------------------------------------------------------+ | Partition Columns: | +--------------------------------------------------------------------+ | sale_date | string | | | region | string | | +--------------------------------------------------------------------+ OK
- 前述のテーブル sale_detail_like の情報を表示するには、次の文を実行します。
desc sale_detail_like
返される情報:odps@ $odps_project>desc sale_detail_like; +--------------------------------------------------------------------+ | Owner: ALIYUN$lili.ll@alibaba-inc.com | Project: $odps_project | | TableComment: | +--------------------------------------------------------------------+ | CreateTime: 2017-06-28 15:42:17 | | LastDDLTime: 2017-06-28 15:42:17 | | LastModifiedTime: 2017-06-28 15:42:17 | +--------------------------------------------------------------------+ | InternalTable: YES | Size: 0 | +--------------------------------------------------------------------+ | Native Columns: | +--------------------------------------------------------------------+ | Field | Type | Label | Comment | +--------------------------------------------------------------------+ | shop_name | string | | | | customer_id | string | | | | total_price | double | | | +--------------------------------------------------------------------+ | Partition Columns: | +--------------------------------------------------------------------+ | sale_date | string | | | region | string | | +--------------------------------------------------------------------+ OK
上記の例では、ライフサイクルを除き、sale_detail_like と sale_detail の属性が同じであることが分かります。 詳細については、「テーブルの照会 (Describe Table)」をご参照ください。
sale_detail_ctas1 の情報を確認すると、sale_date と region は通常の列にすぎず、テーブルのパーティションではないことが分かります。
テーブルの削除
DROP TABLE [IF EXISTS] table_name;
- [if exists] オプションを指定しておらず、テーブルが存在しない場合は、例外が返されます。このオプションを指定すると、テーブルが存在するかどうかにかかわらず、すべての命令文が正常に終了します。
- 外部テーブルが削除されても、OSS 内のデータは削除されません。
create table sale_detail_drop like sale_detail;
drop table sale_detail_drop;
-- テーブルが存在する場合、正常終了します。そうでない場合、例外が返されます。
drop table if exists sale_detail_drop2;
--テーブル sale_detail_drop2 の有無にかかわらず、すべてが正常終了します。
テーブル名の変更
ALTER TABLE table_name RENAME TO new_table_name;
- 名前変更操作では、テーブル名だけが更新されます。テーブル内のデータは更新されません。
- new_table_name と同じ名前のテーブルが存在する場合、エラーが発生します。
- テーブル table_name が存在しない場合は、エラーが発生します。
create table sale_detail_rename1 like sale_detail;
alter table sale_detail_rename1 rename to sale_detail_rename2;
テーブルコメントの変更
ALTER TABLE table_name SET COMMENT 'tbl comment';
- テーブル table_name は存在していなければなりません。
- コメントの長さは 1024 バイト以内にする必要があります。
alter table sale_detail set comment 'new comments for table sale_detail';
変更したコメントを表示するには、コマンド desc を使用します。 詳細については、「テーブルの照会 (Describe Table)」をご参照ください。
テーブルの LastDataModifiedTime の変更
MaxCompute SQL では、touch 操作を使用して、テーブルの LastDataModifiedTime を変更できます。 この操作を実行すると、テーブルの LastDataModifiedTime は、現在時刻になります。
ALTER TABLE table_name TOUCH;
- テーブル table_name が存在しない場合、エラーが返されます。
- この操作でテーブルの LastDataModifiedTime の値が変更されると、MaxCompute ではテーブルデータの変更を認識し、対応するライフサイクルを計算し直します。
非パーティションテーブルのデータ消去
指定した非パーティションテーブルのデータが消去されます。このコマンドは、パーティションテーブルには使用できません。 パーティションテーブルの場合、パーティション内のデータを消去するには、ALTER TABLE table_name DROP PARTITION
を使用します。
TRUNCATE TABLE table_name;