全部產品
Search
文件中心

MaxCompute:讀取以分區方式儲存的OSS資料

更新時間:Sep 10, 2024

MaxCompute支援建立OSS外部表格為分區表,訪問OSS上以分區方式儲存的資料,通過該方式可降低讀取資料量並提升資料處理效率。本文為您介紹MaxCompute支援的OSS標準分區路徑格式和自訂分區路徑格式。

背景資訊

建立OSS外部表格後,MaxCompute會全量掃描OSS目錄下的所有資料,包括子目錄下的資料檔案。但當資料量比較大時,對全目錄掃描會產生不必要的I/O消耗以及資料處理時間。通常,解決該問題有如下兩種方法:

  • (推薦)方式一:在OSS上將資料以標準分區路徑或自訂分區路徑方式儲存。通過MaxCompute建立OSS外部表格時,您需要在建表語句指定分區及oss_location資訊。推薦您使用標準分區路徑。更多分區路徑資訊,請參見標準分區路徑格式自訂分區路徑格式

  • 方式二:規劃多個資料存放路徑。建立多個OSS外部表格來讀取各個路徑下的資料。即每個OSS外部表格指向OSS資料的一個子集。該方式操作比較繁瑣,資料管理效果不佳。不推薦使用該方式。

標準分區路徑格式

標準分區路徑格式如下。

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/';

基於該方式,自訂分區路徑後,即使資料存放不符合推薦的標準分區路徑格式,您也可以正確地對子目錄資料進行訪問。