MaxCompute支援您通過INSERT方式將MaxCompute專案中的資料通過映射的OSS外部表格直接輸出到OSS目錄。本文為您介紹向OSS寫入資料的方法並提供樣本。
背景資訊
與讀取OSS資料類似,MaxCompute支援將內部表資料或處理外部表格得到的資料寫入OSS:
通過內建文本或開來源資料解析器將資料寫入OSS
當需要將資料以CSV、TSV、開源格式或MaxCompute支援的壓縮格式寫入OSS時,您可以通過基於MaxCompute內建文本資料解析器或開來源資料解析器建立的OSS外部表格,執行INSERT操作將資料寫入OSS。
通過自訂解析器將資料寫入OSS
當需要將資料以自訂格式檔案寫入OSS時,您可以通過基於自訂解析器建立的OSS外部表格,執行INSERT操作將資料寫入OSS。
實現樣本請參見樣本:通過自訂解析器將資料寫入OSS。
通過OSS分區上傳功能將資料寫入OSS
當需要將資料以開源格式寫入OSS時,您可以通過基於開來源資料解析器建立的OSS外部表格,及OSS的分區上傳功能,執行INSERT操作將資料寫入OSS。該功能需要在Session層級或Project層級設定
odps.sql.unstructured.oss.commit.mode
屬性進行開啟或關閉。預設關閉。更多分區上傳功能資訊,請參見分區上傳。odps.sql.unstructured.oss.commit.mode
屬性設定不同取值時的實現原理如下:取值為False:MaxCompute寫入到OSS外部表格的資料,會儲存在LOCATION目錄下的.odps檔案夾中。.odps檔案夾中維護了一個.meta檔案,用於保證MaxCompute資料的一致性。.odps的內容只有MaxCompute能正確處理,在其他資料處理引擎中可能無法正確解析,會導致報錯。
取值為True:MaxCompute使用分區上傳功能,以
two-phase commit
的方式保證資料的一致性,同時也不會有.odps目錄以及.meta檔案。相容其他資料處理引擎。
odps.sql.unstructured.oss.commit.mode
可以在Project和Session層級進行設定:使用如下命令在Project層級設定,作用於整個Project。
setproject odps.sql.unstructured.oss.commit.mode =true;
使用如下命令在Session層級設定,只對當前任務生效。
set odps.sql.unstructured.oss.commit.mode =true;
重要insert overwrite
操作環境,在極端情況下如果作業運行失敗會出現與預期不一致的問題,表現為舊資料被刪除,但是新資料並沒有寫入。問題原因:新寫入的資料因為極低機率的硬體故障或中繼資料更新失敗等原因沒有成功寫入目標表,且OSS的刪除操作不支援復原,導致被刪除的舊資料無法恢複。
解決方案:
如果基於舊資料再覆寫OSS外部表格,例如
insert overwrite table T select * from table T;
,需要提前做好OSS資料備份,作業運行失敗時,再基於備份的舊資料覆寫OSS外部表格。如果
insert overwrite
作業可以重複提交,當作業運行失敗時重新提交作業即可。
注意事項
OSS對外提供的頻寬是有限制的,若您頻繁讀取OSS資料,或者大量向OSS寫入資料,若短時間內產生的資料流量超過了OSS執行個體當前的頻寬限額,就會導致頻寬打滿。頻寬打滿直接影響到OSS外表的資料讀取和寫入速度。關於OSS頻寬詳情,請參見OSS有頻寬和QPS限制嗎?。
前提條件
在向OSS寫入資料前,請您確認已完成如下操作:
已授予訪問OSS的許可權。
更多授權資訊,請參見OSS的STS模式授權。
(可選)已準備好OSS儲存空間(Bucket)、OSS目錄及OSS資料檔案。
說明MaxCompute已支援在OSS側自動建立目錄,對於攜帶外部表格及UDF的SQL語句,您可以通過一條SQL語句執行讀寫外部表格及UDF的操作。原手動建立目錄方式仍然支援。
樣本:通過內建文本資料解析器將資料寫入OSS-非分區路徑
讀取樣本:通過內建文本資料解析器建立OSS外部表格-非分區表中建立的OSS外部表格mc_oss_csv_external1的資料,並以CSV格式寫入OSS目錄oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo1/output/
。
操作流程如下:
登入MaxCompute用戶端,執行如下命令建立OSS外部表格映射目標OSS目錄。
create external table if not exists mc_oss_csv_external4 ( vehicleId int, recordId int, patientId int, calls int, locationLatitute double, locationLongtitue double, recordTime string, direction string ) stored by 'com.aliyun.odps.CsvStorageHandler' with serdeproperties ( 'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole' ) location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo1/output/';
建立OSS外部表格文法、參數說明等請參見建立OSS外部表格。
通過MaxCompute用戶端對外部表格執行
insert overwrite
或insert into
命令,將資料寫入OSS。insert into table mc_oss_csv_external4 select * from mc_oss_csv_external1;
執行成功後,您可以在OSS目錄下查看到匯出的檔案。output檔案夾下會產生一個.odps檔案夾,包含.meta檔案和儲存.csv檔案的檔案夾。例如
output/.odps/20210330*********/R2_1_0_0-0_TableSink1-0-.csv
。說明.odps檔案夾中的.meta檔案為MaxCompute額外輸出的宏資料檔案,用於記錄當前檔案夾中有效資料。正常情況下,如果INSERT操作成功,可以認為當前檔案夾的所有資料均是有效資料。只有在有作業失敗的情況下,需要對該宏資料進行解析。即使是在作業中途失敗或被中止的情況下,對於INSERT OVERWRITE操作,再運行一次即可。
對於MaxCompute內建的TSV或CSV解析器,處理產生的檔案數目與對應SQL的並發度相同。
如果
insert overwrite ... select ... from ...;
操作在來源資料表from_tablename上分配了1000個Mapper,則最後將產生1000個TSV或CSV檔案。如果您需要控制組建檔案的數目,可以通過MaxCompute的各種靈活語義和配置來實現。如果Outputer在Mapper裡,可以通過調整
odps.stage.mapper.split.size
的大小來控制Mapper的並發數,從而調整產生的檔案數目。如果Outputer在Reducer或Joiner裡,也可以分別通過odps.stage.reducer.num
和odps.stage.joiner.num
來調整。
樣本:通過內建文本資料解析器將資料寫入OSS-分區路徑
讀取樣本:通過內建文本資料解析器建立OSS外部表格-分區表中建立的OSS外部表格mc_oss_csv_external2的資料,並以CSV格式寫入OSS目錄oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo2/output/
。
操作流程如下:
登入MaxCompute用戶端,執行如下命令建立OSS外部表格映射目標OSS目錄。
create external table if not exists mc_oss_csv_external5 ( vehicleId int, recordId int, patientId int, calls int, locationLatitute double, locationLongtitue double, recordTime string ) partitioned by ( direction string ) stored by 'com.aliyun.odps.CsvStorageHandler' with serdeproperties ( 'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole' ) location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo2/output/';
建立OSS外部表格文法、參數說明等請參見建立OSS外部表格。
通過MaxCompute用戶端對外部表格執行
insert overwrite
或insert into
命令,將資料寫入OSS。insert into table mc_oss_csv_external5 partition (direction) select * from mc_oss_csv_external2;
執行成功後,您可以在OSS目錄下查看到匯出的檔案。output檔案夾下根據INSERT語句指定的分區值產生對應的分區子目錄。分區子目錄中會產生一個.odps檔案夾,包含.meta檔案和儲存.csv檔案的檔案夾。例如
output/direction=N/.odps/20210330*********/R2_1_0_0-0_TableSink1-0-.csv
。說明.odps檔案夾中的.meta檔案為MaxCompute額外輸出的宏資料檔案,用於記錄當前檔案夾中有效資料。正常情況下,如果INSERT操作成功,可以認為當前檔案夾的所有資料均是有效資料。只有在有作業失敗的情況下,需要對該宏資料進行解析。即使是在作業中途失敗或被中止的情況下,對於INSERT OVERWRITE操作,再運行一次即可。
對於MaxCompute內建的TSV或CSV解析器,處理產生的檔案數目與對應SQL的並發度相同。
如果
insert overwrite ... select ... from ...;
操作在來源資料表from_tablename上分配了1000個Mapper,則最後將產生1000個TSV或CSV檔案。如果您需要控制組建檔案的數目,可以通過MaxCompute的各種靈活語義和配置來實現。如果Outputer在Mapper裡,可以通過調整
odps.stage.mapper.split.size
的大小來控制Mapper的並發數,從而調整產生的檔案數目。如果Outputer在Reducer或Joiner裡,也可以分別通過odps.stage.reducer.num
和odps.stage.joiner.num
來調整。
樣本:通過內建文本資料解析器將資料以壓縮方式寫入OSS
讀取樣本:通過內建文本資料解析器建立OSS外部表格-非分區表中建立的OSS外部表格mc_oss_csv_external1的資料,並以GZIP壓縮格式寫入OSS目錄oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo3/output/
。
操作流程如下:
登入MaxCompute用戶端,執行如下命令建立OSS外部表格映射目標OSS目錄。
create external table if not exists mc_oss_csv_external6 ( vehicleId int, recordId int, patientId int, calls int, locationLatitute double, locationLongtitue double, recordTime string, direction string ) stored by 'com.aliyun.odps.CsvStorageHandler' with serdeproperties ( 'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole', 'odps.text.option.gzip.input.enabled'='true', 'odps.text.option.gzip.output.enabled'='true' ) location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo3/output/';
建立OSS外部表格文法、參數說明等請參見建立OSS外部表格。
通過MaxCompute用戶端對外部表格執行
insert overwrite
或insert into
命令,將資料寫入OSS。insert into table mc_oss_csv_external6 select * from mc_oss_csv_external1;
執行成功後,您可以在OSS目錄下查看到匯出的檔案。output檔案夾下會產生一個.odps檔案夾,包含.meta檔案和儲存.gz檔案的檔案夾。例如
output/.odps/20220413*********/M1_0_0-0_TableSink1-0-.csv.gz
。說明.odps檔案夾中的.meta檔案為MaxCompute額外輸出的宏資料檔案,用於記錄當前檔案夾中有效資料。正常情況下,如果INSERT操作成功,可以認為當前檔案夾的所有資料均是有效資料。只有在有作業失敗的情況下,需要對該宏資料進行解析。即使是在作業中途失敗或被中止的情況下,對於INSERT OVERWRITE操作,再運行一次即可。
對於MaxCompute內建的TSV或CSV解析器,處理產生的檔案數目與對應SQL的並發度相同。
如果
insert overwrite ... select ... from ...;
操作在來源資料表from_tablename上分配了1000個Mapper,則最後將產生1000個TSV或CSV檔案。如果您需要控制組建檔案的數目,可以通過MaxCompute的各種靈活語義和配置來實現。如果Outputer在Mapper裡,可以通過調整
odps.stage.mapper.split.size
的大小來控制Mapper的並發數,從而調整產生的檔案數目。如果Outputer在Reducer或Joiner裡,也可以分別通過odps.stage.reducer.num
和odps.stage.joiner.num
來調整。
樣本:通過內建開來源資料解析器將資料寫入OSS
讀取樣本:通過內建文本資料解析器建立OSS外部表格-非分區表中建立的OSS外部表格mc_oss_csv_external1的資料,並以ORC格式寫入OSS目錄oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo4/output/
。
操作流程如下:
登入MaxCompute用戶端,執行如下命令建立OSS外部表格映射目標OSS目錄。
create external table if not exists mc_oss_orc_external ( vehicleId int, recordId int, patientId int, calls int, locationLatitute double, locationLongtitue double, recordTime string, direction string ) stored as orc location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo4/output/';
建立OSS外部表格文法、參數說明等請參見建立OSS外部表格。
通過MaxCompute用戶端對外部表格執行
insert overwrite
或insert into
命令,將資料寫入OSS。insert into table mc_oss_orc_external select * from mc_oss_csv_external1;
執行成功後,您可以在OSS目錄下查看到匯出的檔案。output檔案夾下會產生一個.odps檔案夾,包含.meta檔案和儲存ORC檔案的檔案夾。例如
output/.odps/20220413*********/M1_0_0-0_TableSink1
。說明.odps檔案夾中的.meta檔案為MaxCompute額外輸出的宏資料檔案,用於記錄當前檔案夾中有效資料。正常情況下,如果INSERT操作成功,可以認為當前檔案夾的所有資料均是有效資料。只有在有作業失敗的情況下,需要對該宏資料進行解析。即使是在作業中途失敗或被中止的情況下,對於INSERT OVERWRITE操作,再運行一次即可。
對於MaxCompute內建的TSV或CSV解析器,處理產生的檔案數目與對應SQL的並發度相同。
如果
insert overwrite ... select ... from ...;
操作在來源資料表from_tablename上分配了1000個Mapper,則最後將產生1000個TSV或CSV檔案。如果您需要控制組建檔案的數目,可以通過MaxCompute的各種靈活語義和配置來實現。如果Outputer在Mapper裡,可以通過調整
odps.stage.mapper.split.size
的大小來控制Mapper的並發數,從而調整產生的檔案數目。如果Outputer在Reducer或Joiner裡,也可以分別通過odps.stage.reducer.num
和odps.stage.joiner.num
來調整。
樣本:通過自訂解析器將資料寫入OSS
基於樣本:通過自訂解析器建立OSS外部表格中開發的自訂解析器,為您介紹MaxCompute如何將資料輸出到OSS。
操作流程如下:
登入MaxCompute用戶端,執行如下命令建立OSS外部表格映射目標OSS目錄。
create external table if not exists mc_oss_external ( vehicleId int, recordId int, patientId int, calls int, locationLatitute double, locationLongtitue double, recordTime string, direction string ) stored by 'com.aliyun.odps.udf.example.text.TextStorageHandler' with serdeproperties ( 'delimiter'='|', 'odps.properties.rolearn'='acs:ram::xxxxxxxxxxxxx:role/aliyunodpsdefaultrole' ) location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/SampleData/output' using 'javatest-1.0-SNAPSHOT.jar';
建立OSS外部表格文法、參數說明等請參見建立OSS外部表格。
通過MaxCompute用戶端對外部表格執行
insert overwrite
或insert into
命令,將資料寫入OSS。insert into table mc_oss_external select * from mc_oss_csv_external1;
執行成功後,您可以在OSS目錄下查看到匯出的檔案。output檔案夾下會產生一個.odps檔案夾,包含.meta檔案和儲存TEXT檔案的檔案夾。例如
output/.odps/20220413*********/M1_0_0-0_TableSink1-0
。說明.odps檔案夾中的.meta檔案為MaxCompute額外輸出的宏資料檔案,用於記錄當前檔案夾中有效資料。正常情況下,如果INSERT操作成功,可以認為當前檔案夾的所有資料均是有效資料。只有在有作業失敗的情況下,需要對該宏資料進行解析。即使是在作業中途失敗或被中止的情況下,對於INSERT OVERWRITE操作,再運行一次即可。
對於MaxCompute內建的TSV或CSV解析器,處理產生的檔案數目與對應SQL的並發度相同。
如果
insert overwrite ... select ... from ...;
操作在來源資料表from_tablename上分配了1000個Mapper,則最後將產生1000個TSV或CSV檔案。如果您需要控制組建檔案的數目,可以通過MaxCompute的各種靈活語義和配置來實現。如果Outputer在Mapper裡,可以通過調整
odps.stage.mapper.split.size
的大小來控制Mapper的並發數,從而調整產生的檔案數目。如果Outputer在Reducer或Joiner裡,也可以分別通過odps.stage.reducer.num
和odps.stage.joiner.num
來調整。