MaxCompute支援建立OSS外部表格為分區表,訪問OSS上以分區方式儲存的資料,通過該方式可降低讀取資料量並提升資料處理效率。本文為您介紹MaxCompute支援的OSS標準分區路徑格式和自訂分區路徑格式。
背景資訊
建立OSS外部表格後,MaxCompute會全量掃描OSS目錄下的所有資料,包括子目錄下的資料檔案。但當資料量比較大時,對全目錄掃描會產生不必要的I/O消耗以及資料處理時間。通常,解決該問題有如下兩種方法:
標準分區路徑格式
標準分區路徑格式如下。
oss://<oss_endpoint>/<Bucket名稱>/<目錄名稱>/<partitionKey1=value1>/<partitionKey2=value2>/...
因為OSS資料是離線準備的,即通過OSS控制台或其他OSS工具上傳到OSS中,所以資料的路徑格式取決於上傳時的格式。
參數名稱 | 可選/必填 | 說明 |
oss_endpoint | 必填 | OSS訪問網域名稱資訊。建議您使用OSS提供的內網網域名稱,否則將產生OSS流量費用。更多OSS內網網域名稱資訊,請參見訪問網域名稱和資料中心。 說明 建議資料檔案存放的OSS地區與MaxCompute專案所在地區保持一致。由於MaxCompute只在部分地區部署,跨地區的資料連通性可能存在問題。 |
Bucket名稱 | 必填 | OSS儲存空間名稱,即Bucket名稱。查看儲存空間名稱操作,請參見列舉儲存空間。 |
目錄名稱 | 必填 | 指定OSS目錄名稱。目錄後不需要指定檔案名稱。 |
partitionKey | 必填 | OSS外部表格的分區列名。 |
value | 必填 | OSS外部表格的分區列值。 |
例如,某公司會將每天產生的Log檔案以CSV格式存放在OSS上,並通過MaxCompute以天為周期處理資料。則儲存OSS資料的標準分區路徑應設定如下。
oss://oss-odps-test/log_data/year=2016/month=06/day=01/logfile
oss://oss-odps-test/log_data/year=2016/month=06/day=02/logfile
oss://oss-odps-test/log_data/year=2016/month=07/day=10/logfile
oss://oss-odps-test/log_data/year=2016/month=08/day=08/logfile
...
基於上述分區儲存路徑,建立OSS外部表格、引入並分析分區資料的命令樣本如下。
--建立OSS外部表格。
CREATE EXTERNAL TABLE log_table_external (
click STRING,
ip STRING,
url STRING
)
partitioned BY (
year STRING,
month STRING,
day STRING
)
stored BY 'com.aliyun.odps.CsvStorageHandler'
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket名稱/oss-odps-test/log_data/';
--引入OSS分區資料。
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '06', day = '01');
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '06', day = '02');
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '07', day = '10');
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '08', day = '08');
...
--分析資料。只訪問log_data/year=2016/month=06/day=01子目錄下的檔案(logfile),不會對整個log_data目錄做全量資料掃描。
SELECT count(DISTINCT(ip)) FROM log_table_external WHERE year = '2016' AND month = '06' AND day = '01';
完整的讀取標準分區路徑資料樣本,請參見樣本:通過內建文本資料解析器建立OSS外部表格-分區表。
自訂分區路徑格式
如果OSS上的資料實際上已按照分區方式儲存,只是路徑不是標準分區路徑格式時,MaxCompute支援將不同的子目錄綁定至不同的分區。
自訂分區路徑格式樣本如下,只有分區列值,無分區列名。
oss://oss-odps-test/log_data_customized/2016/06/01/logfile
oss://oss-odps-test/log_data_customized/2016/06/02/logfile
oss://oss-odps-test/log_data_customized/2016/07/10/logfile
oss://oss-odps-test/log_data_customized/2016/08/08/logfile
...
建立OSS外部表格後,通過alter table ... add partition ... location ...
命令指定子目錄,將不同的子目錄綁定到不同的分區,命令樣本如下。
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '06', day = '01')
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket名稱/oss-odps-test/log_data_customized/2016/06/01/';
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '06', day = '02')
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket名稱/oss-odps-test/log_data_customized/2016/06/02/';
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '07', day = '10')
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket名稱/oss-odps-test/log_data_customized/2016/07/10/';
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '08', day = '08')
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket名稱/oss-odps-test/log_data_customized/2016/08/08/';
基於該方式,自訂分區路徑後,即使資料存放不符合推薦的標準分區路徑格式,您也可以正確地對子目錄資料進行訪問。