MaxCompute支援將MaxCompute專案中的資料匯出至外部儲存(OSS、Hologres),以供其他計算引擎使用。本文介紹UNLOAD命令的使用方法及具體樣本。
本文中的命令您可以在如下工具平台執行:
功能介紹
MaxCompute支援使用unload命令將MaxCompute的資料匯出至OSS、Hologres外部儲存,OSS支援以CSV格式或其他開源格式儲存資料。其中:
MaxCompute的資料需要先匯出至OSS中,才可以通過OSS匯出至其他計算引擎,例如Amazon Redshift和BigQuery。
重複匯出不會覆蓋已匯出的檔案,會追加新的匯出檔案。
使用限制
UNLOAD命令的使用限制如下:
匯出至OSS的檔案的分割方式和檔案名稱由系統自動產生,不支援自訂匯出檔案名稱或檔案尾碼。
將MaxCompute資料匯出至Hologres中,不支援使用雙簽名授權模式。
不支援將MaxCompute資料匯出至Hologres分區表中。
匯出的開源格式檔案不支援添加尾碼名。
注意事項
UNLOAD命令本身不計費,UNLOAD命令中的查詢子句需要掃描資料並使用計算資源計算結果,因此查詢子句按照普通SQL作業計費。
通過OSS儲存結構化資料在一些情境中可以節省儲存費用,但需要提前做好費用估算。
MaxCompute儲存費用為0.018 USD/GB/月,更多儲存計費資訊,請參見儲存費用(隨用隨付)。資料匯入MaxCompute後有5倍左右的壓縮率,計費依據的資料量是壓縮後的資料。
OSS儲存標準型單價為0.018 USD/GB/月,另有其他低頻訪問型、歸檔型、冷歸檔型儲存,請參見儲存費用。
如果您匯出資料只是為了節省儲存費用,建議您根據資料特徵測試估算壓縮率,根據匯出時的查詢語句估算UNLOAD費用,以及後續對匯出資料的訪問方式進行合理評估,避免因不必要的資料移轉產生額外費用。
前提條件
操作帳號已具備MaxCompute的相關許可權。
執行
unload操作前,操作帳號需要具備MaxCompute專案中待匯出表資料的讀取許可權(Select)。授權操作請參見MaxCompute許可權。操作帳號已具備外部儲存資料對應資料來源的相關許可權。
從MaxCompute匯出資料至外部儲存前,您需要先對外部儲存(OSS或Hologres)進行授權,允許MaxCompute訪問外部儲存。
unload命令的授權模式沿用了MaxCompute外部表格的授權模式,OSS和Hologres的授權引導如下。外部儲存:OSS
您可以一鍵授權,具備更高安全性。詳情請參見STS模式授權。
說明本文樣本採用一鍵授權方式,角色名稱定義為AliyunODPSDefaultRole。
外部儲存:Hologres
您可建立一個RAM角色,為其授權允許MaxCompute訪問的許可權,並將角色添加至Hologres執行個體,完成授權,操作詳情請參見建立Hologres外部表格(STS模式)。
完成上述授權的前期準備後,您需要根據匯出資料的格式類型,選擇對應的匯出方式:
通過內建Extractor匯出(StorageHandler)
命令格式
UNLOAD FROM {<select_statement>|<table_name> [PARTITION (<pt_spec>)]} INTO LOCATION <external_location> STORED BY <StorageHandler> [WITH SERDEPROPERTIES ('<property_name>'='<property_value>',...)];參數說明
外部儲存:OSS
參數
是否必填
說明
select_statement
否
SELECT查詢子句,從源表(分區表或非分區表)中查詢需要插入目標OSS路徑的資料。更多SELECT資訊,請參見SELECT文法。
table_name、pt_spec
否
使用表名稱或表名稱加分區名稱的方式指定需要匯出的資料。該匯出方式不產生查詢語句,不會產生費用。pt_spec格式為
(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)。external_location
是
指定匯出資料存放區的目標OSS路徑,格式為
'oss://<oss_endpoint>/<object>'。更多OSS路徑資訊,請參見通過IPv6協議訪問OSS。StorageHandler
是
指定內建的StorageHandler名稱。固定取值為
com.aliyun.odps.CsvStorageHandler或com.aliyun.odps.TsvStorageHandler,是內建的處理CSV、TSV格式檔案的StorageHandler,定義了如何讀或寫CSV、TSV檔案。相關邏輯已經由系統實現,您只需要指定該參數。此方法匯出的檔案預設添加.csv、.tsv尾碼名。使用方法和MaxCompute外部表格一致,請參見建立OSS外部表格。'<property_name>'='<property_value>'
否
property_name為屬性名稱,property_value為屬性值。支援的屬性和MaxCompute外部表格一致。更多屬性資訊,請參見建立OSS外部表格。
外部儲存:Hologres
參數
是否必填
說明
select_statement
否
SELECT查詢子句,從源表(非分區表)中查詢需要插入目標Hologres路徑的資料。更多SELECT資訊,請參見SELECT文法。table_name
否
使用表名稱的方式指定需要匯出的資料。該匯出方式不產生查詢語句,不會產生費用。
external_location
是
指定匯出資料存放區的目標Hologres路徑,格式為
'jdbc:postgresql://<endpoint>:<port>/<database>?ApplicationName=MaxCompute&[currentSchema=<schema>&][useSSL={true|false}&]table=<holo_table_name>/'。更多Hologres路徑資訊,請參見建立Hologres外部表格。StorageHandler
是
指定內建的StorageHandler名稱。固定取值為
com.aliyun.odps.jdbc.JdbcStorageHandler,使用JdbcStorageHandler串連方式。'<property_name>'='<property_value>'
否
property_name為屬性名稱,property_value為屬性值。資料匯出至Hologres必填如下參數:
'odps.properties.rolearn'='<ram_arn>':指定RAM角色的ARN資訊,用於STS認證。您可以在RAM存取控制頁面,單擊目標RAM角色名稱後,在基本資料地區擷取。
'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver':指定串連Hologres資料庫的驅動程式。固定取值為
org.postgresql.Driver。'odps.federation.jdbc.target.db.type'='holo':指定串連的資料庫類型。固定取值為
holo。
Hologres支援的屬性和MaxCompute外部表格一致。更多屬性資訊,請參見建立Hologres外部表格。
使用樣本
外部儲存:OSS
假設將MaxCompute專案中表sale_detail的資料匯出至OSS。sale_detail的資料如下:
+------------+-------------+-------------+------------+------------+ | shop_name | customer_id | total_price | sale_date | region | +------------+-------------+-------------+------------+------------+ | s1 | c1 | 100.1 | 2013 | china | | s2 | c2 | 100.2 | 2013 | china | | s3 | c3 | 100.3 | 2013 | china | | null | c5 | NULL | 2014 | shanghai | | s6 | c6 | 100.4 | 2014 | shanghai | | s7 | c7 | 100.5 | 2014 | shanghai | +------------+-------------+-------------+------------+------------+登入OSS管理主控台,建立OSS Bucket目錄
mc-unload/data_location/,地區為oss-cn-hangzhou,並組織OSS路徑。更多建立OSS Bucket資訊,請參見控制台建立儲存空間。
根據Bucket、地區、Endpoint資訊組成OSS路徑如下:
oss://oss-cn-hangzhou-internal.aliyuncs.com/mc-unload/data_location登入MaxCompute用戶端,執行UNLOAD命令,將sale_detail表的資料匯出至OSS。命令樣本如下:
樣本1:將sale_detail表中的資料匯出為CSV格式並壓縮為GZIP。命令樣本如下。
-- 控制匯出檔案個數:設定單個Worker讀取MaxCompute表資料的大小,單位為MB。由於MaxCompute表有壓縮,匯出到OSS的資料一般會膨脹4倍左右。 SET odps.stage.mapper.split.size=256; -- 匯出資料。 UNLOAD FROM (SELECT * FROM sale_detail) INTO LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/mc-unload/data_location' STORED BY 'com.aliyun.odps.CsvStorageHandler' WITH SERDEPROPERTIES ('odps.properties.rolearn'='acs:ram::<uid>:role/AliyunODPSDefaultRole', 'odps.text.option.gzip.output.enabled'='true'); -- 等效於如下語句。 SET odps.stage.mapper.split.size=256; UNLOAD FROM sale_detail INTO LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/mc-unload/data_location' STORED BY 'com.aliyun.odps.CsvStorageHandler' WITH SERDEPROPERTIES ('odps.properties.rolearn'='acs:ram::<uid>:role/AliyunODPSDefaultRole', 'odps.text.option.gzip.output.enabled'='true');樣本2:將sale_detail表中分區為sale_date='2013',region='china'的資料匯出為TSV格式並壓縮為GZIP。
-- 控制匯出檔案個數:設定單個Worker讀取MaxCompute表資料的大小,單位為MB。由於MaxCompute表有壓縮,匯出到OSS的資料一般會膨脹4倍左右。 SET odps.stage.mapper.split.size=256; -- 匯出資料。 UNLOAD FROM sale_detail PARTITION (sale_date='2013',region='china') INTO LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/mc-unload/data_location' STORED BY 'com.aliyun.odps.TsvStorageHandler' WITH SERDEPROPERTIES ('odps.properties.rolearn'='acs:ram::<uid>:role/AliyunODPSDefaultRole', 'odps.text.option.gzip.output.enabled'='true');
'odps.text.option.gzip.output.enabled'='true'用於指定匯出檔案為GZIP壓縮格式,當前僅支援GZIP壓縮格式。登入OSS管理主控台,查看目標OSS路徑的匯入結果。
樣本1結果如下。

樣本2結果如下。

外部儲存:Hologres
假設將MaxCompute專案中表
data_test的資料匯出至Hologres。data_test的資料如下:+------------+------+ | id | name | +------------+------+ | 3 | rgege | | 4 | Gegegegr | +------------+------+在Hologres建立資料接收表
mc_2_holo(所在資料庫名稱為test),您可以在HoloWeb的SQL編輯器中執行建表語句,詳情請參見串連HoloWeb並執行查詢。建表語句如下:說明資料接收表的欄位類型需與MaxCompute表欄位類型對應,詳情請參見MaxCompute與Hologres的資料類型映射。
CREATE TABLE mc_2_holo (id INT, name TEXT);登入MaxCompute用戶端,執行UNLOAD命令,將
data_test表的資料匯出至Hologres。命令樣本如下:UNLOAD FROM (SELECT * FROM data_test) INTO LOCATION 'jdbc:postgresql://hgprecn-cn-5y**********-cn-hangzhou-internal.hologres.aliyuncs.com:80/test?ApplicationName=MaxCompute¤tSchema=public&useSSL=false&table=mc_2_holo/' STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' WITH SERDEPROPERTIES ( 'odps.properties.rolearn'='acs:ram::13**************:role/aliyunodpsholorole', 'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 'odps.federation.jdbc.target.db.type'='holo' );在Hologres中查詢匯出資料:
SELECT * FROM mc_2_holo;返回結果樣本如下:
id name 4 Gegegegr 3 rgege
匯出其他開源格式資料
命令格式
UNLOAD FROM {<select_statement>|<table_name> [PARTITION (<pt_spec>)]}
INTO
LOCATION <external_location>
[ROW FORMAT SERDE '<serde_class>'
[WITH SERDEPROPERTIES ('<property_name>'='<property_value>',...)]
]
STORED AS <file_format>
[PROPERTIES ('<tbproperty_name>'='<tbproperty_value>')];參數說明
參數 | 是否必填 | 說明 |
select_statement | 否 | SELECT查詢子句,從源表(分區表或非分區表)中查詢需要插入目標OSS路徑的資料。更多SELECT資訊,請參見SELECT文法。 |
table_name、pt_spec | 否 | 使用表名稱或表名稱加分區名稱的方式指定需要匯出的資料。該匯出方式不產生查詢語句,不會產生費用。pt_spec格式為 |
external_location | 是 | 指定匯出資料存放區的目標OSS路徑,格式為 |
serde_class | 否 | 使用方法和MaxCompute外部表格一致,請參見建立OSS外部表格。 |
'<property_name>'='<property_value>' | 否 | property_name為屬性名稱,property_value為屬性值。支援的屬性和MaxCompute外部表格一致。更多屬性資訊,請參見建立OSS外部表格。 |
file_format | 是 | 指定匯出資料檔案格式。例如ORC、PARQUET、RCFILE、SEQUENCEFILE和TEXTFILE。使用方法和MaxCompute外部表格一致,請參見建立OSS外部表格。 |
'<tbproperty_name>'='<tbproperty_value>' | 否 | tbproperty_name為外部表格擴充資訊屬性名稱,tbproperty_value為外部表格擴充資訊屬性值。例如開來源資料支援匯出SNAPPY或LZO壓縮格式,設定壓縮屬性為 |
使用樣本:將MaxCompute專案中表sale_detail的資料匯出至OSS。
樣本資料
-- sale_detail表資料。
+------------+-------------+-------------+------------+------------+
| shop_name | customer_id | total_price | sale_date | region |
+------------+-------------+-------------+------------+------------+
| s1 | c1 | 100.1 | 2013 | china |
| s2 | c2 | 100.2 | 2013 | china |
| s3 | c3 | 100.3 | 2013 | china |
| null | c5 | NULL | 2014 | shanghai |
| s6 | c6 | 100.4 | 2014 | shanghai |
| s7 | c7 | 100.5 | 2014 | shanghai |
+------------+-------------+-------------+------------+------------+登入OSS管理主控台,建立OSS Bucket目錄
mc-unload/data_location/,地區為oss-cn-hangzhou,並組織OSS路徑。更多建立OSS Bucket資訊,請參見控制台建立儲存空間。
根據Bucket、地區、Endpoint資訊組成OSS路徑如下:
oss://oss-cn-hangzhou-internal.aliyuncs.com/mc-unload/data_location登入MaxCompute用戶端,執行UNLOAD命令,將sale_detail表的資料匯出至OSS。
樣本1:將sale_detail表中的資料匯出為PARQUET格式並壓縮為SNAPPY。
-- 控制匯出檔案個數:設定單個Worker讀取MaxCompute表資料的大小,單位為MB。 -- 由於MaxCompute表有壓縮,匯出到OSS的資料一般會膨脹4倍左右。 SET odps.stage.mapper.split.size=256; -- 匯出資料。 UNLOAD FROM (SELECT * FROM sale_detail) INTO LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/mc-unload/data_location' ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' WITH SERDEPROPERTIES ('odps.properties.rolearn'='acs:ram::<uid>:role/AliyunODPSDefaultRole') STORED AS PARQUET PROPERTIES('mcfed.parquet.compression'='SNAPPY');樣本2:將sale_detail表中分區為sale_date='2013',region='china'的資料匯出為PARQUET格式並壓縮為SNAPPY。
--控制匯出檔案個數:設定單個Worker讀取MaxCompute表資料的大小,單位為MB。由於MaxCompute表有壓縮,匯出到OSS的資料一般會膨脹4倍左右。 SET odps.stage.mapper.split.size=256; --匯出資料。 UNLOAD FROM sale_detail PARTITION (sale_date='2013',region='china') INTO LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/mc-unload/data_location' ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' WITH SERDEPROPERTIES ('odps.properties.rolearn'='acs:ram::<uid>:role/AliyunODPSDefaultRole') STORED AS PARQUET PROPERTIES('mcfed.parquet.compression'='SNAPPY');說明以SNAPPY或LZO壓縮格式匯出資料時,匯出檔案不支援顯示.snappy或.lzo尾碼名。
樣本3:將sale_detail表中的資料匯出為txt檔案並指定逗號為分隔字元。
SET odps.sql.allow.fullscan=true; UNLOAD FROM (SELECT * FROM sale_detail) INTO LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/mc-unload/data_location/' ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ('field.delim'=',') STORED AS TEXTFILE properties ('odps.external.data.enable.extension'='true');
Unload函數匯出設定前尾碼和副檔名
使用unload命令將MaxCompute的表匯出為檔案時,有的業務情境需要指定檔案的首碼、尾碼以及副檔名,按照下列的操作可以自訂檔案的首碼尾碼,以及預設產生對應檔案格式的副檔名。
文法說明。
內建解析器匯出CSV、TSV等格式檔案。
-- 內建解析器,匯出CSV、TSV等格式檔案。 UNLOAD FROM {<select_statement>|<table_name> [PARTITION (<pt_spec>)]} INTO LOCATION <external_location> [STORED BY <StorageHandler>] [WITH SERDEPROPERTIES ('<property_name>'='<property_value>',...)];匯出ORC、Parquet等開源格式檔案。
UNLOAD FROM {<select_statement>|<table_name> [PARTITION (<pt_spec>)]} INTO LOCATION <external_location> [ROW FORMAT SERDE '<serde_class>' [WITH SERDEPROPERTIES ('<property_name>'='<property_value>',...)] ] STORED AS <file_format> [PROPERTIES('<tbproperty_name>'='<tbproperty_value>')];設定首碼的property_name為:odps.external.data.prefix,值可以自訂,長度不超過10個字元。
設定尾碼的property_name為:odps.external.data.enable.extension,值為
true即尾碼顯示檔案格式。其他參數請參見通過內建Extractor匯出(StorageHandler)。
設定首碼的tbproperty_name為:odps.external.data.prefix,值可以自訂,長度不超過10個字元。
設定尾碼的tbproperty_name為:odps.external.data.enable.extension,值為
true即尾碼顯示檔案格式。其他參數請參見匯出其他開源格式資料。
參數說明
property_name
使用情境
說明
property_value
預設值
odps.external.data.output.prefix
(相容odps.external.data.prefix)
當需要添加輸出檔案的自訂首碼名時,請添加該屬性。
僅包含數字,字母,底線(a-z, A-Z, 0-9, _)
長度在1-10之間。
合格字元組合,例如'mc_'。
無
odps.external.data.enable.extension
當需要顯示輸出檔案的副檔名時,請添加該屬性。
True表示顯示輸出檔案的副檔名,反之不顯示副檔名。
True
False
False
odps.external.data.output.suffix
當需要添加輸出檔案的自訂尾碼名時,請添加該屬性。
僅包含數字,字母,底線(a-z, A-Z, 0-9, _)。
合格字元組合,例如'_hangzhou'。
無
odps.external.data.output.explicit.extension
當需要添加輸出檔案的自訂副檔名時,請添加該屬性。
僅包含數字,字母,底線(a-z, A-Z, 0-9, _)
長度在1-10之間。
優先順序高於參數
odps.external.data.enable.extension。
合格字元組合,例如"jsonl"。
無
尾碼參考。
各外部表格通過參數
odps.external.data.enable.extension=true自動產生的副檔名如下。檔案格式
SerDe
尾碼
SEQUENCEFILE
org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
.sequencefile
TEXTFILE
org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
.txt
RCFILE
org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe
.rcfile
ORC
org.apache.hadoop.hive.ql.io.orc.OrcSerde
.orc
PARQUET
org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe
.parquet
AVRO
org.apache.hadoop.hive.serde2.avro.AvroSerDe
.avro
JSON
org.apache.hive.hcatalog.data.JsonSerDe
.json
CSV
org.apache.hadoop.hive.serde2.OpenCSVSerde
.csv
使用樣本。
匯出text格式檔案,添加首碼為mc_,尾碼為_beijing,並自動產生副檔名。
UNLOAD FROM (SELECT * FROM vehicle) INTO LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/textfile' row format serde 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' STORED AS textfile PROPERTIES ( 'odps.external.data.output.prefix'='mc_', 'odps.external.data.output.suffix'='_beijing', 'odps.external.data.enable.extension'='true');在指定匯出資料存放區的目標OSS路徑查看匯出結果:

匯出json格式檔案,添加首碼為mc_,尾碼為_beijing,並自訂副檔名為jsonl。
UNLOAD FROM (SELECT * FROM vehicle) INTO LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/json' ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS textfile PROPERTIES ( 'odps.external.data.output.prefix'='mc_', 'odps.external.data.output.suffix'='_beijing', 'odps.external.data.output.explicit.extension'='jsonl');在指定匯出資料存放區的目標OSS路徑查看匯出結果:

相關文檔
若希望將外部儲存上的CSV格式或其他開源格式資料匯入至MaxCompute,請參見LOAD。