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/';
DLA能夠將存儲在OSS上的目錄或文件映射成一張表。表中的數據就是OSS中的文件內容。大數據
對於分區表來講,分區列對應OSS上的目錄,並且是有特殊命名規則的目錄:spa
對於上面例子中的建表語句,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 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中當前分區值信息自動同步。同步
對於已經存在的可是不知足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';
對於上面的語句,
語法:
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');
對於上面的語句,
全表查詢時,獲得的是全部分區下的數據。
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 | +-------+
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/';
$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 將不會被計算在內。
本文做者:金絡
本文爲雲棲社區原創內容,未經容許不得轉載。