如何使用Data Lake Analytics建立分區表

前言

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

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

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

建立分區表

在DLA中,建立一張分區表須要在建表語句中指定 PARTITIONED BY, 例如
建立一張名爲tbl3_part的分區表,該表有兩個分區列,分別爲p和q。性能

CREATE EXTERNAL TABLE tbl3_part 
(foo int, bar string)
PARTITIONED BY (p string, q string)
STORED AS TEXTFILE
LOCATION 'oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table3/';

分區表在OSS上的目錄結構

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

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

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

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

$osscmd ls oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table3
prefix list is:
object list is:
2018-08-08 14:23:17 5.68KB Standard oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table3/p=3/q=3/kv1.txt
2018-08-08 18:01:08 5.68KB Standard oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table3/p=30/q=30/kv1.txt

使用MSCK命令更新分區信息

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

MSCK REPAIR TABLE tbl3_part;

執行MSCK成功後,經過 SHOW PARTITIONS 語句能夠看到表中全部的分區信息。cmd

mysql> show partitions tbl3_part;
+-----------+
| Result    |
+-----------+
| p=3/q=3   |
| p=30/q=30 |
+-----------+

MSCK只能識別符合DLA分區列命名規則的目錄,即分區列的目錄名爲 分區列名=分區列值。
所以,當OSS上的分區目錄發上變化時,執行MSCK命令,DLA能夠根據OSS中當前分區值信息自動同步。同步

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

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

添加分區

語法:

ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];

partition_spec:
  : (partition_column = partition_col_value, partition_column = partition_col_value, ...)

能夠一次指定添加多個分區,分區之間用逗號分隔。
示例,

ALTER TABLE order_part ADD 
    PARTITION (dt='2008-08-08', status='ready') location '/path/to/ready/part080808',
    PARTITION (dt='2008-08-09', status='new') location '/path/to/new/part080809';

對於上面的語句,

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

刪除分區

語法:

ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec[, PARTITION partition_spec, ...];

能夠一次指定刪除多個分區,分區之間用逗號分隔。
示例,

ALTER TABLE order_part DROP
    PARTITION (dt='2008-08-08', status='ready');

對於上面的語句,

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

分區表查詢

全表查詢時,獲得的是全部分區下的數據。

mysql> select count(*) from tbl3_part;
+-------+
| _col0 |
+-------+
|  1000 |
+-------+

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

mysql> select * from tbl3_part limit 3;
+------+---------+------+------+
| foo  | bar     | p    | q    |
+------+---------+------+------+
|  238 | val_238 | 3    | 3    |
|   86 | val_86  | 3    | 3    |
|  311 | val_311 | 3    | 3    |
+------+---------+------+------+

查詢時可使用分區列作filter

mysql> select count(*) from tbl3_part where p='3';
+-------+
| _col0 |
+-------+
|   500 |
+-------+

注意事項

  1. OSS上分區列的目錄結構的嵌套順序須要與表中定義的順序一致
    好比 對於本文例子中的目錄結構,下面的建表語句是錯誤的
CREATE EXTERNAL TABLE tbl3_part 
(col1 int, col2 string)
PARTITIONED BY (q string, p string)
STORED AS TEXTFILE
LOCATION 'oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table3/';
  1. 分區表只會掃描分區列所在目錄下的數據.
    對於下面的目錄結構
$osscmd ls oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table4/
prefix list is:
object list is:
2018-08-08 14:23:56 5.68KB Standard oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table4/kv1.txt
2018-08-08 14:23:48 5.68KB Standard oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table4/p=4/kv2.txt
2018-08-08 14:23:40 5.68KB Standard oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table4/p=4/q=4/kv3.txt

若是建表語句中指定的分區列爲 p 和 q,則該表的數據文件只有 kv3.txt.
數據文件 kv1.txt 和 kv2.txt 將不會被計算在內。

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

 



本文做者:金絡

原文連接

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

相關文章
相關標籤/搜索