本文為您介紹對錶、分區、列執行DDL操作過程中的常見問題。
問題類別 | 常見問題 |
表操作 | |
分區操作 | |
列操作 | |
生命週期操作 |
MaxCompute支援虛擬表嗎?例如MySQL中的DUAL表?
不支援虛擬表,您可以手動建立DUAL表。
MaxCompute的表有無索引?
沒有索引,Hash Clustering可以提供類似資料庫中Cluster index的效果,詳情請參見表操作。
如何修改表的Hash Clustering屬性?
增加表的Hash Clustering屬性:
alter table table_name [clustered by (col_name [, col_name, ...]) [sorted by (col_name [asc | desc] [, col_name [asc | desc] ...])] into number_of_buckets buckets];
。去除表的Hash Clustering屬性:
alter table table_name not clustered;
。
如何將非分區表修改為分區表?
不支援更改非分區表為分區表,也不支援增加分區列。您可以重新建立一張分區表,詳情請參見表操作。
因誤操作刪除的表可以恢複嗎?
MaxCompute提供備份與恢複功能。但免費周期只有24小時,您可以自訂設定備份資料保留周期。如果誤刪除24小時內,可以通過備份與恢複命令恢複表資料。更多備份恢複資訊,請參見備份與恢複。
如何查詢某個使用者建立的表?
只查詢某個使用者建立的表可以使用中繼資料視圖TABLES,通過owner_name欄位過濾。更多TABLES資訊,請參見TABLES。
如何查看指定的表是否存在?
可以使用函數TABLE_EXISTS查看指定的表是否存在,更多函數資訊,請參見TABLE_EXISTS。
如何擷取專案下的所有表名稱?
您可以通過MaxCompute用戶端執行show tables;
命令或使用MaxCompute的中繼資料服務。更多資訊請參見表操作或Information Schema。
如何快速查看專案下哪些表是分區表?
您可以通過MaxCompute用戶端執行如下命令查看專案下的分區表資訊。
select table_name from information_schema.columns where is_partition_key = true group by table_name;
如何查看MaxCompute表的最近訪問時間?
您可以在DataWorks資料地圖中查詢表,進入表詳情頁面擷取表的最近訪問時間。
如何查看錶的資料量?
查看錶的資料量包含查看資料條數和佔用的物理空間大小:
您可以執行
desc
命令查看全量表的物理空間。執行SQL語句select count() as cnt from table_name;
查看錶的資料條數。您可以執行
desc
命令和WHERE條件組合方式,查看分區表單個分區佔用的物理空間大小。執行SQL語句select count() as cnt from table_name where ...;
查看分區資料條數。
如何查看錶的行數?
您可以通過MaxCompute用戶端執行select count(*) from table_name;
命令查看分區表或非分區表的行數。
建立的表為什麼在DataWorks上看不到?
如果表不是通過DataWorks可視化建立方式建立的,而是通過SQL語句建立,DataWorks介面不會立即顯示建立的表,會存在2~3個小時的延時。
分區和分區列的區別是什嗎?
MaxCompute中的表可以分區,分區表有分區列。您可以通過分區列建立分區。
例如分區ds=20150101
,此處ds
是一個分區列,而ds=20150101
是一個分區。
一張表的分區的數量是否越多越好?
在MaxCompute中,一張表最多允許有60000個分區,同時每個分區的容量沒有上限。但是分區數量過多,不便於統計和分析。
MaxCompute限制單個作業中最多不能超過一定數量的Instance,而作業中的Instance數量和輸入的資料量以及分區數量是密切相關的,所以您需要根據業務情況,選擇合適的分區策略。
如果源表沒有分區欄位,是否可以增加或更改分區?
MaxCompute不支援在源表上直接增加或修改分區欄位,分區欄位一旦建立就無法修改。您可以重新建立一張分區表,使用動態分區SQL將源表資料匯入至新分區表,詳情請參見插入或覆寫動態分區資料(DYNAMIC PARTITION)。
如何查看指定的分區是否存在?
可以使用函數PARTITION_EXISTS查看指定的分區是否存在,更多函數資訊,請參見PARTITION_EXISTS。
如何查看分區數量?
您可以通過Information Schema的PARTITIONS視圖,擷取到分區名,進而擷取到分區數量。
是否可以添加或刪除列?
在MaxCompute中,可以添加列,也可以刪除列,目前添加複雜資料類型列和刪除列正在邀測中,試用操作詳情請參見新功能試用申請。
如何添加列?
添加列的命令樣本如下。如果表中已經存在一部分資料,則新添加列的值為NULL。
alter table table_name add columns (col_name1 type1, col_name2 type2…);
更多添加列文法資訊,請參見添加列。
如何設定自增長列?
MaxCompute不支援自增長列功能,如果您有此需求,且資料量比較小,建議使用ROW_NUMBER實現。
MaxCompute單表可以存放的最大列數是多少?
MaxCompute單表可以存放的最大列數為1200列。如果您的列數超過限制,可以參考如下方式處理:
對資料進行降維,縮減到1200列以內。
修改資料的儲存方式,例如裝置認證、稀疏或稠密矩陣。
待建立表的列名與關鍵字相同,如何解決?
在對錶、列或分區命名時如果使用關鍵字,需要給關鍵字加``
符號進行轉義,否則會報錯。
如何修改列的資料類型?
不支援修改列的資料類型,只能添加列。生產環境中的表不允許刪除表欄位、修改表欄位和分區欄位。如果必須修改,請刪除表之後重建立表。您也可以建立外部表格,刪除並重建表後,可以重新載入資料。資料類型詳情請參見資料類型版本說明。
設定表的生命週期為3天,每個表的分區儲存量很大,如何清理分區表舊資料?
設定了生命週期的表超過設定時間沒有修改,MaxCompute會自動回收。
您可以執行desc table_name partition(pt_spec);
命令查看舊的分區修改時間是否在生命週期內修改過。通過desc tablename;
命令查看生命週期時間,MaxComptue每天17:00點進行回收,DataWorks上的資料顯示有延遲,一般會延遲一天。