如何使用Data Lake Analytics創建分區表
前言
Data Lake Analytics (後文簡稱DLA)提供了無服務化的大數據分析服務,幫助用戶通過標準的SQL語句直接對存儲在OSS、TableStore上的數據進行查詢分析。
在關係型數據庫中,用戶可以對大數據量的表進行分區,提高查詢的性能。同樣在DLA中,用戶可以使用分區表將數據進行細化,達到縮短查詢響應時間的目的。
本文將以OSS數據源爲例,詳細介紹如何在DLA中創建和使用分區表。
創建分區表
在DLA中,創建一張分區表需要在建表語句中指定 PARTITIONED BY, 例如
創建一張名爲tbl3_part的分區表,該表有兩個分區列,分別爲p和q。
分區表在OSS上的目錄結構
DLA可以將存儲在OSS上的目錄或文件映射成一張表。表中的數據就是OSS中的文件內容。
對於分區表來說,分區列對應OSS上的目錄,而且是有特殊命名規則的目錄:
- 分區列對應表的LOCATION下的一個子目錄,目錄的命名規則爲 分區列名=分區值
- 如果有多個分區列,則需要按照建表語句中指定的分區列的順序依次嵌套
對於上面例子中的建表語句,OSS上的目錄結構爲:
使用MSCK命令更新分區信息
建表成功後,需要執行 MSCK REPAIR TABLE 命令,將分區信息同步到DLA中。
執行MSCK成功後,通過 SHOW PARTITIONS 語句可以看到表中所有的分區信息。
MSCK只能識別符合DLA分區列命名規則的目錄,即分區列的目錄名爲 分區列名=分區列值。
因此,當OSS上的分區目錄發上變化時,執行MSCK命令,DLA可以根據OSS中當前分區值信息自動同步。
使用ALTER命令添加/刪除分區
對於已經存在的但是不滿足DLA分區列命名規則的目錄,用戶可以通過 ALTER命令更新表的分區信息。
添加分區
語法:
可以一次指定添加多個分區,分區之間用逗號分隔。
示例,
對於上面的語句,
- 如果新增的分區已經存在,則執行失敗,報錯 "Partition already exists";
- 如果使用了 [IF NOT EXISTS], 當新增分區已存在時,執行不會報錯,新的LOCATION會覆蓋掉原有分區所指向的目錄;
刪除分區
語法:
可以一次指定刪刪除多個分區,分區之間用逗號分隔。
示例,
對於上面的語句,
- 如果刪除的分區不存在,執行不會報錯;
- 如果使用了 [IF EXISTS], 當刪除分區不存在時,執行不會報錯;
- DROP 分區目前只支持 "分區列=分區值" 的指定方式。不支持分區值是一個表達式,比如 partitionCol > 100;
- 如果刪除的分區目錄名符合 分區列名=分區列值 的命名規則,執行MSCK命令仍會將已經刪除的分區自動添加。
分區表查詢
全表查詢時,得到的是所有分區下的數據。
當執行 SELECT * 時,可以發現分區列將以列的形式出現在表中定義的數據列的後面。
查詢時可以使用分區列做filter
注意事項
- OSS上分區列的目錄結構的嵌套順序需要與表中定義的順序一致
- 比如 對於本文例子中的目錄結構,下面的建表語句是錯誤的。
- 分區表只會掃描分區列所在目錄下的數據.
- 對於下面的目錄結構
如果建表語句中指定的分區列爲 p 和 q,則該表的數據文件只有 kv3.txt.
數據文件 kv1.txt 和 kv2.txt 將不會被計算在內。
- 如果有新增的OSS分區目錄,則需要手動執行 MSCK REPAIR TABLE table_name 命令或者ALTER ADD PARTITION命令使其生效,再進行查詢。
---------------------------------------
本文作者:金絡
原文鏈接:https://yq.aliyun.com/articles/624151
本文爲雲棲社區原創內容,未經允許不得轉載。