當您被添加到項目空間並被賦予建表等許可權後,即可操作MaxCompute。由於在MaxCompute中的操作對象(輸入、輸出)都是表,所以在處理資料之前,首先要建立表、分區。

建立/刪除表的方式有以下幾種:

本文將為您介紹如何通過用戶端常用命令進行建立表、查看錶和刪除表的操作,用戶端的安裝請參見準備工作中的安裝並配置用戶端

建立表

建表語句如下所示:
CREATE 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], ...)] 
[LIFECYCLE days] 
[AS select_statement]
CREATE TABLE [IF NOT EXISTS] table_name 
LIKE existing_table_name
建表語句說明:
  • 表名與列名均對大小寫不敏感。
  • 在建立表時,如果不指定if not exists選項而存在同名表,則返回出錯;若指定此選項,則無論是否存在同名表,即使原表結構與要建立的目標表結構不一致,均返回成功。已存在的同名表的元資訊不會被改動。
  • 資料類型:包括Bigint、Double、Boolean、Datetime、Decimal和String等多種資料類型。
  • 表名,列名中不能有特殊字元,只能用英文的a-z,A-Z及數字和底線 _,且以字母開頭,名稱的長度不超過128位元組。
  • Partitioned by:指定表的分區欄位,目前僅支援String類型,其他類型行為未定義。分區值不可以有雙位元組字元(如中文),必須是以英文字母a-z,A-Z開始後可跟字母數字,名稱的長度不超過128位元組。允許的字元包括空格、冒號(:)、底線(_)、美元符($)、井號(#)、點(.)、驚嘆號(!)和(@),出現其他字元行為未定義。例如(\t),(\n),(/)等 。當利用分區欄位對錶進行分區時,新增分區、更新分區內資料和讀取分區資料均不需要做全表掃描,可以提高處理效率。
  • 注釋內容是長度不超過1024位元組的有效字串。
  • lifecycle指明此表的生命週期,單位:天。create table like語句不會複製源表的生命週期屬性。
  • 目前,在表中建的分區層次不能超過6級。一個表允許的分區個數支援按照具體的project配置,預設60,000個。
    说明
建立表示例如下:
create table test1 (key string); -- 建立非分區表,表名 test1,欄位名 key,資料類型 string。 
create table test2 (key bigint) partitioned by (pt string, ds string); --建立分區表 
create table test3 (key boolean) partitioned by (pt string, ds string) lifecycle 100; -- 建立帶有生命週期的表 
create table test4 like test3; -- 除生命週期屬性外,test3 的其他屬性(欄位類型,分區類型等)均與 test4 完全一致 
create table test5 as select * from test2; -- 這個操作會建立 test5,但分區,生命週期資訊不會被拷貝到目標表中。 
-- 此操作僅會將 test2 的資料複製到 test5 中(如果 test2 有資料的話,此樣本中 test2 為空白表,後續章節會介紹資料匯入)。

建立表的情境如下:

假設需要建立一張使用者表user,包括如下資訊:
  • user_id bigint類型:使用者標識,唯一標識一個使用者。
  • gender bigint類型:性別(0,未知;1,男;2,女)。
  • age bigint:使用者年齡。

按照Region(地區)和dt(日期)進行分區,生命週期為365天。

建表語句如下所示:
CREATE TABLE user 
( user_id BIGINT, gender BIGINT COMMENT '0 unknow,1 male, 2 Female', age BIGINT) 
PARTITIONED BY (region string, dt string) LIFECYCLE 365;

建立分區

當建立一張分區表之後,為了往該表裡面匯入不同分區資料,您需要建立分區。命令如下:
alter table table_name add [if not exists] partition partition_spec partition_spec: 
: (partition_col1 = partition_col_value1, partition_col2 = partiton_col_value2, ...)
如上述樣本,給使用者表user添加地區為hangzhou,日期為20150923的分區,句子顯示如下:
alter table user add if not exists partition(region='hangzhou',dt='20150923');

查看錶資訊

當建立表成功之後,您可以通過desc <table_name>;命令查看錶的資訊。

您可執行命令desc test3;查看上述樣本中表test3的資訊。

結果顯示如下:
odps@ $odps_project>desc test3;
+------------------------------------------------------------------------------------+
| Owner: ALIYUN$maojing.mj@alibaba-inc.com | Project: $odps_project
| TableComment: |
+------------------------------------------------------------------------------------+
| CreateTime: 2015-09-18 12:26:57 |
| LastDDLTime: 2015-09-18 12:26:57 |
| LastModifiedTime: 2015-09-18 12:26:57 |
| Lifecycle: 100 |
+------------------------------------------------------------------------------------+
| InternalTable: YES | Size: 0 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | Comment |
+------------------------------------------------------------------------------------+
| key | boolean | | |
+------------------------------------------------------------------------------------+
| Partition Columns: |
+------------------------------------------------------------------------------------+
| pt | string |      |
| ds | string |      |
+------------------------------------------------------------------------------------+
您可執行命令 desc test4;查看上述樣本中表test4的資訊。
odps@ $odps_project>desc test4;
+------------------------------------------------------------------------------------+
| Owner: ALIYUN$maojing.mj@alibaba-inc.com | Project: $odps_project
| TableComment: |
+------------------------------------------------------------------------------------+
| CreateTime: 2015-09-18 12:27:09 |
| LastDDLTime: 2015-09-18 12:27:09 |
| LastModifiedTime: 2015-09-18 12:27:09 |
+------------------------------------------------------------------------------------+
| InternalTable: YES | Size: 0 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | Comment |
+------------------------------------------------------------------------------------+
| key | boolean | | |
+------------------------------------------------------------------------------------+
| Partition Columns: |
+------------------------------------------------------------------------------------+
| pt | string |      |
| ds | string |      |
+------------------------------------------------------------------------------------+

您會發現,除生命週期屬性外,test3的其他屬性(欄位類型、分區類型等)均與test4完全一致。查看錶資訊的更多詳情請參見表操作

您如果查看test5的表資訊,pt、ds兩個欄位僅會作為普通列存在,而不是表的分區 。

刪除分區

刪除分區的命令如下所示:
alter table table_name drop [if exists] partition_spec; partition_spec: 
: (partition_col1 = partition_col_value1, partition_col2 = partiton_col_value2, ...)
比如刪除地區為hangzhou,日期為20150923的分區,語句如下所示:
alter table user drop if exists partition(region='hangzhou',dt='20150923');

刪除表

刪除表的命令如下所示:
DROP TABLE [IF EXISTS] table_name;
刪除test2表的樣本如下:
drop table test2;

更多詳情請參見表操作刪除表。