UNLOAD 命令用于将 MaxCompute 项目中的数据导出至外部存储(OSS、Hologres),供其他计算引擎使用。
权限要求
MaxCompute 权限:操作账号需要具备 MaxCompute 项目中待导出表数据的读取权限(Select)。授权操作请参见MaxCompute权限。
外部存储权限:从 MaxCompute 导出数据至外部存储前,需要先对外部存储(OSS 或 Hologres)进行授权,允许 MaxCompute 访问外部存储。
OSS 授权:支持一键授权,具备更高安全性。详情请参见STS模式授权。示例采用一键授权方式,角色名称定义为
AliyunODPSDefaultRole。Hologres 授权:需要创建一个 RAM 角色,为其授权允许 MaxCompute 访问的权限,并将角色添加至 Hologres 实例,完成授权。操作详情请参见创建Hologres外部表(STS模式)。
导出至外部存储
UNLOAD 命令采用追加模式。重复向同一目标路径导出数据时,系统不会覆盖已有的文件,而是在该路径下生成新的文件。若需覆盖,请在执行 UNLOAD 前手动清理目标路径。
导出至OSS
导出为文本格式(CSV / TSV)
此方式使用内置的 StorageHandler 导出数据,默认会为文件添加 .csv 或 .tsv 后缀。
语法
UNLOAD FROM {<select_statement>|<table_name> [PARTITION (<pt_spec>)]}
INTO
LOCATION <oss_location>
STORED BY <StorageHandler>
[WITH SERDEPROPERTIES ('<property_name>'='<property_value>',...)];核心配置
配置项 | 说明 |
oss_location | 目标OSS路径,格式为 |
StorageHandler | 指定内置处理器:
|
SERDEPROPERTIES | 用于配置导出属性,最常用的是:
|
使用示例
示例1:导出 CSV 格式并压缩为 GZIP
将 MaxCompute 项目中表sale_detail的数据导出至 OSS。sale_detail的数据如下:
-- 分区字段:sale_date、region
+------------+-------------+-------------+------------+------------+
| 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管理控制台,创建 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_locationMaxCompute 侧:登录 MaxCompute客户端,执行 UNLOAD 命令。
方式1:使用 SELECT 查询
-- 设置单个 Worker 读取 MaxCompute 表数据的大小为 256MB,用于控制导出文件个数。 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' );方式2:直接指定表名(不产生查询费用)
-- 设置单个 Worker 读取 MaxCompute 表数据的大小为 256MB,用于控制导出文件个数。 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' );验证结果:登录OSS管理控制台,查看目标 OSS 路径的导入结果。导出的文件为 CSV 格式,并压缩为 GZIP 格式。
示例2:导出分区数据为 TSV 格式并压缩
将sale_detail表中分区为sale_date='2013'和region='china'的数据导出为 TSV 格式并压缩为 GZIP。
-- 分区字段:sale_date、region
+------------+-------------+-------------+------------+------------+
| 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管理控制台,创建 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_locationMaxCompute 侧:登录 MaxCompute客户端,执行 UNLOAD 命令。
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' );验证结果:登录OSS管理控制台,查看目标 OSS 路径的导入结果。导出的文件为 TSV 格式,并压缩为 GZIP 格式。
导出为开源格式(Parquet / ORC 等)
此方式支持将数据导出为多种开源列式存储或结构化数据格式。
语法
UNLOAD FROM {<select_statement>|<table_name> [PARTITION (<pt_spec>)]}
INTO
LOCATION <oss_location>
[ROW FORMAT SERDE '<serde_class>'
[WITH SERDEPROPERTIES ('<property_name>'='<property_value>',...)]
]
STORED AS <file_format>
[PROPERTIES ('<tbproperty_name>'='<tbproperty_value>')];核心配置
配置项 | 说明 |
oss_location | 目标OSS路径,格式为 |
serde_class | 指定序列化/反序列化库,例如 |
SERDEPROPERTIES |
|
file_format | 必填。指定文件格式,如 |
PROPERTIES | - |
支持的格式和压缩
文件格式 | 支持的压缩格式 | 说明 |
PARQUET | SNAPPY、LZO | 列式存储格式,适合分析型查询 |
ORC | SNAPPY、LZO | 列式存储格式,适合 Hadoop 生态 |
TEXTFILE | GZIP | 文本格式,支持自定义分隔符 |
RCFILE | - | 行列混合存储格式 |
SEQUENCEFILE | - | Hadoop 序列文件格式 |
AVRO | - | 数据序列化格式 |
JSON | - | JSON 格式 |
使用示例
示例1:导出 PARQUET 格式并压缩为 SNAPPY
将 MaxCompute 项目中表sale_detail的数据导出至 OSS。sale_detail的数据如下:
-- 分区字段:sale_date、region
+------------+-------------+-------------+------------+------------+
| 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管理控制台,创建 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_locationMaxCompute 侧:登录 MaxCompute客户端,执行 UNLOAD 命令。
-- 设置单个 Worker 读取 MaxCompute 表数据的大小为 256MB,用于控制导出文件个数。 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');验证结果:登录OSS管理控制台,查看目标 OSS 路径的导入结果。导出的文件为 PARQUET 格式,并压缩为 SNAPPY 格式。
示例2:导出分区数据为 PARQUET 格式
将 MaxCompute sale_detail 表分区为sale_date='2013',region='china'的数据导出为 PARQUET 格式并压缩为 SNAPPY。sale_detail的数据如下:
-- 分区字段:sale_date、region
+------------+-------------+-------------+------------+------------+
| 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管理控制台,创建 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_locationMaxCompute 侧:登录 MaxCompute客户端,执行 UNLOAD 命令。
-- 设置单个 Worker 读取 MaxCompute 表数据的大小为 256MB,用于控制导出文件个数。 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');验证结果:登录OSS管理控制台,查看目标 OSS 路径的导入结果。导出的文件为 PARQUET 格式,并压缩为 SNAPPY 格式。
示例3:导出 TEXTFILE 格式并指定分隔符
将sale_detail表中的数据导出为 TXT 文件并指定逗号为分隔符。
-- 分区字段:sale_date、region
+------------+-------------+-------------+------------+------------+
| 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管理控制台,创建 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_locationMaxCompute 侧:登录 MaxCompute客户端,执行 UNLOAD 命令。
-- 设置单个 Worker 读取 MaxCompute 表数据的大小为 256MB,用于控制导出文件个数。 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');验证结果:登录OSS管理控制台,查看目标 OSS 路径的导入结果。导出的文件为 TXT 格式,并以逗号分隔。
自定义文件名前后缀以及扩展名
UNLOAD 到 OSS 时,可以通过 PROPERTIES 或 SERDEPROPERTIES 中的属性自定义输出文件的前缀、后缀和扩展名。
语法
UNLOAD FROM {<select_statement>|<table_name> [PARTITION (<pt_spec>)]}
INTO
LOCATION <oss_location>
[ROW FORMAT SERDE '<serde_class>'
[WITH SERDEPROPERTIES ('<property_name>'='<property_value>',...)]
]
STORED AS <file_format>
[PROPERTIES ('<tbproperty_name>'='<tbproperty_value>',...)];核心配置
property_name/tbproperty_name | 说明 | 示例值 |
odps.external.data.output.prefix | 文件名前缀(字母、数字、下划线,1-10个字符)。 | 'mc_' |
odps.external.data.output.suffix | 文件名后缀(字母、数字、下划线)。 | '_hangzhou' |
odps.external.data.enable.extension | 是否显示默认扩展名(如 | 'true' |
odps.external.data.output.explicit.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 |
以 SNAPPY 或 LZO 压缩格式导出数据时,导出文件不支持显示.snappy 或.lzo 后缀名。
使用示例
示例1:导出 TEXTFILE 格式文件,添加前缀和后缀
将 MaxCompute 项目中表sale_detail的数据导出 TXT 格式文件至 OSS,并命名为 mc_<系统生成>_beijing.txt 的格式。sale_detail的数据如下:
-- 分区字段:sale_date、region
+------------+-------------+-------------+------------+------------+
| 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管理控制台,创建 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_locationMaxCompute 侧:登录 MaxCompute客户端,执行 UNLOAD 命令。
UNLOAD FROM (SELECT * FROM sale_detail) 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管理控制台,查看目标 OSS 路径的导入结果。导出的文件名为
mc_<系统生成>_beijing.txt。
示例2:导出 JSON 格式文件,自定义扩展名
将 MaxCompute 项目中表sale_detail的数据导出 JSON 格式文件至 OSS,并命名为 mc_<系统生成的文件名>_beijing.json 的格式。sale_detail的数据如下:
-- 分区字段:sale_date、region
+------------+-------------+-------------+------------+------------+
| 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管理控制台,创建 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_locationMaxCompute 侧:登录 MaxCompute客户端,执行 UNLOAD 命令。
UNLOAD FROM (SELECT * FROM sale_detail) INTO LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/json' ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH SERDEPROPERTIES ( 'odps.external.data.output.prefix'='mc_', 'odps.external.data.output.suffix'='_beijing', 'odps.external.data.output.explicit.extension'='json') STORED AS JSON;验证结果:登录OSS管理控制台,查看目标 OSS 路径的导入结果。导出的文件名为
mc_<系统生成的文件名>_beijing.json。
导出至Hologres
使用限制
不支持双签名:导出至 Hologres 中,不支持使用双签名授权模式。
不支持分区表:不支持将数据导出至 Hologres 分区表。
类型映射:Hologres 数据接收表的字段类型需与 MaxCompute 表字段类型对应,详情请参见MaxCompute与Hologres的数据类型映射。
语法
UNLOAD FROM {<select_statement>|<table_name> [PARTITION (<pt_spec>)]}
INTO
LOCATION <hologres_location>
STORED BY <StorageHandler>
[WITH SERDEPROPERTIES ('<property_name>'='<property_value>',...)];核心配置
配置项 | 说明 |
hologres_location | 目标 Hologres 表的 JDBC 连接字符串。格式为 |
StorageHandler | 指定内置处理器。固定取值为 |
SERDEPROPERTIES | 必须包含以下三个属性:
|
使用示例
将 MaxCompute表data_test导出至Hologres表mc_2_holo。data_test的数据如下:
+------------+------+
| id | name |
+------------+------+
| 3 | rgege |
| 4 | Gegegegr |
+------------+------+操作步骤:
Hologres 侧:在 Hologres 中创建接收表
mc_2_holo。CREATE TABLE mc_2_holo (id INT, name TEXT);MaxCompute 侧:登录MaxCompute客户端,执行UNLOAD命令。
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 命令本身不计费:UNLOAD 命令本身不产生费用。
查询子句计费:UNLOAD 命令中的查询子句需要扫描数据并使用计算资源计算结果,因此查询子句按照普通 SQL 作业计费。
存储计费
通过 OSS 存储结构化数据在一些场景中可以节省存储费用,但需要提前做好费用估算:
MaxCompute 存储费用:0.018 USD/GB/月,更多存储计费信息,请参见存储费用(按量计费)。数据导入MaxCompute后有5倍左右的压缩率,计费依据的数据量是压缩后的数据。
OSS 存储费用:OSS存储标准型单价为0.018 USD/GB/月,另有其他低频访问型、归档型、冷归档型存储,请参见存储费用。
费用优化建议
如果导出数据只是为了节省存储费用,建议:
测试压缩率:根据数据特征测试估算压缩率。
估算 UNLOAD 费用:根据导出时的查询语句估算 UNLOAD 费用。
评估访问方式:评估后续对导出数据的访问方式,避免因不必要的数据迁移产生额外费用。
相关文档
若希望将外部存储上的 CSV 格式或其他开源格式数据导入至 MaxCompute,请参见LOAD。