ここでは、クライアントからテーブルを作成、表示、削除する方法を説明します。また、テーブル名やテーブル情報の変更方法についても説明します。

テーブルの作成

SQL 文の形式
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)」をご参照ください。

例:

販売記録を保存するためのテーブル sale_detail を作成します。 このテーブルでは、sale_date と region をパーティション列として使用します。 テーブルを作成するための文は、次のとおりです。
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;
テーブル sale_detail にデータがある場合、前述の SQL 文では、sale_detail のすべてのデータがテーブル sale_detail_ctas1 にコピーされます。
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にコピーすることはできません。

テーブル情報の表示

SQL 文の形式:
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 は通常の列にすぎず、テーブルのパーティションではないことが分かります。

テーブルの削除

SQL 文の形式:
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 の有無にかかわらず、すべてが正常終了します。

テーブル名の変更

SQL 文の形式:
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 は、現在時刻になります。

SQL 文の形式:
ALTER TABLE table_name TOUCH;
  • テーブル table_name が存在しない場合、エラーが返されます。
  • この操作でテーブルの LastDataModifiedTime の値が変更されると、MaxCompute ではテーブルデータの変更を認識し、対応するライフサイクルを計算し直します。

非パーティションテーブルのデータ消去

指定した非パーティションテーブルのデータが消去されます。このコマンドは、パーティションテーブルには使用できません。 パーティションテーブルの場合、パーティション内のデータを消去するには、ALTER TABLE table_name DROP PARTITION を使用します。

コマンド形式:
TRUNCATE TABLE table_name;