前言

Data Lake Analytics (後文簡稱DLA)提供了無服務化的大數據分析服務,幫助用戶通過標準的SQL語句直接對存儲在OSS、TableStore上的數據進行查詢分析。

在關係型數據庫中,用戶可以對大數據量的表進行分區,提高查詢的性能。同樣在DLA中,用戶可以使用分區表將數據進行細化,達到縮短查詢響應時間的目的。

本文將以OSS數據源爲例,詳細介紹如何在DLA中創建和使用分區表。

創建分區表

在DLA中,創建一張分區表需要在建表語句中指定 PARTITIONED BY, 例如

創建一張名爲tbl3_part的分區表,該表有兩個分區列,分別爲p和q。

分區表在OSS上的目錄結構

DLA可以將存儲在OSS上的目錄或文件映射成一張表。表中的數據就是OSS中的文件內容。

對於分區表來說,分區列對應OSS上的目錄,而且是有特殊命名規則的目錄:

  1. 分區列對應表的LOCATION下的一個子目錄,目錄的命名規則爲 分區列名=分區值
  2. 如果有多個分區列,則需要按照建表語句中指定的分區列的順序依次嵌套

對於上面例子中的建表語句,OSS上的目錄結構爲:

使用MSCK命令更新分區信息

建表成功後,需要執行 MSCK REPAIR TABLE 命令,將分區信息同步到DLA中。

執行MSCK成功後,通過 SHOW PARTITIONS 語句可以看到表中所有的分區信息。

MSCK只能識別符合DLA分區列命名規則的目錄,即分區列的目錄名爲 分區列名=分區列值。

因此,當OSS上的分區目錄發上變化時,執行MSCK命令,DLA可以根據OSS中當前分區值信息自動同步。

使用ALTER命令添加/刪除分區

對於已經存在的但是不滿足DLA分區列命名規則的目錄,用戶可以通過 ALTER命令更新表的分區信息。

添加分區

語法:

可以一次指定添加多個分區,分區之間用逗號分隔。

示例,

對於上面的語句,

  1. 如果新增的分區已經存在,則執行失敗,報錯 "Partition already exists";
  2. 如果使用了 [IF NOT EXISTS], 當新增分區已存在時,執行不會報錯,新的LOCATION會覆蓋掉原有分區所指向的目錄;

刪除分區

語法:

可以一次指定刪刪除多個分區,分區之間用逗號分隔。

示例,

對於上面的語句,

  1. 如果刪除的分區不存在,執行不會報錯;
  2. 如果使用了 [IF EXISTS], 當刪除分區不存在時,執行不會報錯;
  3. DROP 分區目前只支持 "分區列=分區值" 的指定方式。不支持分區值是一個表達式,比如 partitionCol > 100;
  4. 如果刪除的分區目錄名符合 分區列名=分區列值 的命名規則,執行MSCK命令仍會將已經刪除的分區自動添加。

分區表查詢

全表查詢時,得到的是所有分區下的數據。

當執行 SELECT * 時,可以發現分區列將以列的形式出現在表中定義的數據列的後面。

查詢時可以使用分區列做filter

注意事項

  1. OSS上分區列的目錄結構的嵌套順序需要與表中定義的順序一致
  2. 比如 對於本文例子中的目錄結構,下面的建表語句是錯誤的

  1. 分區表只會掃描分區列所在目錄下的數據.
  2. 對於下面的目錄結構

如果建表語句中指定的分區列爲 p 和 q,則該表的數據文件只有 kv3.txt.

數據文件 kv1.txt 和 kv2.txt 將不會被計算在內。

  1. 如果有新增的OSS分區目錄,則需要手動執行 MSCK REPAIR TABLE table_name 命令或者ALTER ADD PARTITION命令使其生效,再進行查詢。

---------------------------------------

本文作者:金絡

原文鏈接:https://yq.aliyun.com/articles/624151

本文爲雲棲社區原創內容,未經允許不得轉載。

聲明:該文觀點僅代表作者本人,搜狐號系信息發佈平臺,搜狐僅提供信息存儲空間服務。
相關文章