教程:如何使用DataLakeAnalytics建立分割槽表
教程:如何使用Data Lake Analytics建立分割槽表
前言
Data Lake Analytics (後文簡稱DLA)提供了無服務化的大資料分析服務,幫助使用者通過標準的SQL語句直接對儲存在OSS、TableStore上的資料進行查詢分析。
在關係型資料庫中,使用者可以對大資料量的表進行分割槽,提高查詢的效能。同樣在DLA中,使用者可以使用分割槽表將資料進行細化,達到縮短查詢響應時間的目的。
本文將以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上的目錄,而且是有特殊命名規則的目錄:
- 分割槽列對應表的LOCATION下的一個子目錄,目錄的命名規則為 分割槽列名=分割槽值
- 如果有多個分割槽列,則需要按照建表語句中指定的__分割槽列的順序__依次巢狀
對於上面例子中的建表語句,OSS上的目錄結構為:
$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中。
MSCK REPAIR TABLE tbl3_part;
執行MSCK成功後,通過 SHOW PARTITIONS 語句可以看到表中所有的分割槽資訊。
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`;
對於上面的語句,
- 如果新增的分割槽已經存在,則執行失敗,報錯 “Partition already exists”;
- 如果使用了 [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`);
對於上面的語句,
- 如果刪除的分割槽不存在,執行不會報錯;
- 如果使用了 [IF EXISTS], 當刪除分割槽不存在時,執行不會報錯;
- DROP 分割槽目前只支援 “分割槽列=分割槽值” 的指定方式。不支援分割槽值是一個表示式,比如 partitionCol > 100;
- 如果刪除的分割槽目錄名符合 分割槽列名=分割槽列值 的命名規則,執行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 |
+-------+
注意事項
- 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/`;
- 分割槽表只會掃描分割槽列所在目錄下的資料.
對於下面的目錄結構
$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 將不會被計算在內。
- 如果有新增的OSS分割槽目錄,則需要手動執行 MSCK REPAIR TABLE table_name 命令或者ALTER ADD PARTITION命令使其生效,再進行查詢。
相關文章
- 分割槽表及分割槽索引建立示例索引
- Oracle 建立分割槽表Oracle
- Oracle 分割槽表的建立Oracle
- OceaBase 分割槽表建立技巧
- 如何查詢分割槽表的分割槽及子分割槽
- 使用split對分割槽表再分割槽
- 分割槽表並行建立索引並行索引
- 使用Oracle Database 11g建立Interval分割槽表OracleDatabase
- 全面學習分割槽表及分割槽索引(6)--建立range-list組合分割槽索引
- 深入學習分割槽表及分割槽索引(5)--建立range-hash組合分割槽(續)索引
- Oracle分割槽表的使用Oracle
- oracle分割槽表和分割槽表exchangeOracle
- mysql幾種表分割槽建立案例MySql
- 週六直播充電:探究Oracle分割槽表建立和使用Oracle
- 全面學習分割槽表及分割槽索引(13)--分隔表分割槽索引
- oracle分割槽表和非分割槽表exchangeOracle
- MySql建立分割槽MySql
- 建立sawp分割槽
- Mac磁碟如何分割槽?教你Mac系統磁碟自由分割槽教程!Mac
- Oracle分割槽表及分割槽索引Oracle索引
- INTERVAL分割槽表鎖分割槽操作
- Oracle中分割槽表的使用Oracle
- 全面學習分割槽表及分割槽索引(9)--刪除表分割槽索引
- 全面學習分割槽表及分割槽索引(11)--合併表分割槽索引
- 全面學習分割槽表及分割槽索引(12)--修改list表分割槽索引
- 學習筆記】分割槽表和分割槽索引——新增表分割槽(二)筆記索引
- [間隔分割槽]Oracle10g、11g建立間隔分割槽表Oracle
- 【分割槽】如何將一個普通錶轉換為分割槽表
- MySQL Key分割槽表建立方法介紹MySql
- 簡單ORACLE分割槽表、分割槽索引Oracle索引
- rebuild分割槽表分割槽索引的方法Rebuild索引
- 全面學習分割槽表及分割槽索引(10)--交換分割槽索引
- PLSQL根據分割槽表的分割槽名批次truncate分割槽SQL
- 全面學習分割槽表及分割槽索引(8)--增加和收縮表分割槽索引
- 【學習筆記】分割槽表和分割槽索引——分割槽表的其他管理(三)筆記索引
- 範圍分割槽表和INTERVAL分割槽表對於SPLIT分割槽的區別
- Oracle分割槽之五:建立分割槽索引總結Oracle索引
- (3) MySQL分割槽表使用方法MySql