MaxCompute允许您将MaxCompute项目中的数据导出到OSS,方便您通过OSS存储结构化数据,并方便OSS上的其他计算引擎使用导出的数据。本文为您介绍如何使用UNLOAD命令向OSS导出MaxCompute上的CSV格式或其他开源格式数据。

前提条件

在执行UNLOAD命令前,请确认您已完成如下操作:
  • 已开通OSS服务。

    更多开通OSS服务信息,请参见开通OSS服务

  • 已具备MaxCompute项目中待导出表数据的读取权限(Select)。

    更多授权信息,请参见授权

使用限制

UNLOAD命令的使用限制如下:
  • 导出至OSS的文件的分割方式和文件名称由系统自动生成,不支持自定义导出文件名称或文件后缀。
  • 导出至OSS的文件暂不支持压缩,后续版本会增加导出数据压缩功能。
  • 重复导出不会覆盖已导出的文件,会追加新的导出文件。

注意事项

  • UNLOAD命令本身不计费,UNLOAD命令中的查询子句需要扫描数据并使用计算资源计算结果,因此查询子句按照普通SQL作业计费。
  • 通过OSS存储结构化数据在一些场景中可以节省存储费用,但需要提前做好费用估算。

    MaxCompute存储费用为0.12元/GB/月,更多存储计费信息,请参见存储费用(按量计费)。数据导入MaxCompute后有5倍左右的压缩率,计费依据的数据量是压缩后的数据。

    OSS存储标准型单价为0.12元/GB/月,另有其他低频访问型、归档型、冷归档型存储,请参见存储费用

    如果您导出数据只是为了节省存储费用,建议您根据数据特征测试估算压缩率,根据导出时的查询语句估算UNLOAD费用,以及后续对导出数据的访问方式进行合理评估,避免因不必要的数据迁移产生额外费用。

OSS授权模式

在向OSS导出数据时,您需要对OSS进行授权。UNLOAD命令的授权模式沿用了MaxCompute外部表的授权模式,授权模式如下:
  • 方式一(推荐):在UNLOAD命令中,配置with serdeproperties属性,通过RAM角色完成OSS授权。
    1. 登录RAM控制台,创建可信实体类型为阿里云服务的RAM角色。配置角色类型普通服务角色、角色名称(例如unload2oss),选择受信服务为大数据计算服务

      更多操作信息,请参见创建可信实体为阿里云服务的RAM角色

      创建角色
    2. 完成角色创建后,为新建角色添加系统策略AliyunOSSFullAccess。

      更多操作信息,请参见为RAM角色授权

      添加权限
  • 方式二:在UNLOAD命令中,为目标OSS路径直接指定AccessKey ID和AccessKey Secret完成OSS授权。
    说明 该方式在授权时,会明文显示AccessKey ID和AccessKey Secret,存在一定安全隐患,不建议您使用。更多参数信息,请参见OSS访问域名使用规则
    指定目标OSS路径的语法如下:
    'oss://<AccessKey_Id>:<AccessKey_Secret>@<oss_endpoint>/<object>'

    其中:oss_endpoint为OSS Bucket所在区域对应ECS的经典网络访问(内网)的Endpoint。您可以登录OSS管理控制台,打开指定Bucket的概览页面,在访问域名区域查看Bucket的Endpoint。

    查看Endpoint
完成授权后,您需要根据导出数据的格式类型,选择对应的导出方式:

通过内置Extractor导出(StorageHandler)

  • 命令格式
    unload from (<select_statement> ) 
    into 
    location <external_location>
    [stored by <StorageHandler>]
    [with serdeproperties (<Options>)];
  • 参数说明
    • select_statementselect查询子句,从源表(分区表或非分区表)中查询需要插入目标OSS路径的数据。更多select信息,请参见SELECT语法
    • external_location:必填。指定导出数据存储的目标OSS路径,格式为'oss://<oss_endpoint>/<object>'(方式一授权模式)或'oss://<AccessKey_Id>:<AccessKey_Secret>@<oss_endpoint>/<object>'(方式二授权模式)。更多OSS路径信息,请参见OSS访问域名使用规则
    • StorageHandler:必填。指定内置的StorageHandler名称。固定取值为com.aliyun.odps.CsvStorageHandler,是内置的处理CSV格式文件的StorageHandler,定义了如何读或写CSV文件。相关逻辑已经由系统实现,您只需要指定该参数。此方法导出的文件默认添加.csv后缀名。使用方法和MaxCompute外部表一致,请参见内置Extractor访问OSS
    • Options:可选。指定源表相关参数,支持的属性和MaxCompute外部表一致。更多属性信息,请参见内置Extractor访问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   |
    +------------+-------------+-------------+------------+------------+
    1. 登录OSS管理控制台,创建OSS Bucket目录mc-unload/data_location/,区域为oss-cn-hangzhou,并组织OSS路径。更多创建OSS Bucket信息,请参见创建存储空间Bucket
      根据Bucket、区域、Endpoint信息组织OSS路径如下:
      oss://oss-cn-hangzhou-internal.aliyuncs.com/mc-unload/data_location
    2. 登录MaxCompute客户端,执行UNLOAD命令,将sale_detail表的数据导出至OSS,格式为CSV。命令示例如下:
      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::139699392458****:role/unload2oss', 'odps.text.option.gzip.output.enabled'='true'); 

      'odps.text.option.gzip.output.enabled'='true'用于指定导出文件为GZIP压缩格式,当前仅支持GZIP压缩格式。

    3. 登录OSS管理控制台,查看目标OSS路径的导入结果。导入结果

导出其他开源格式数据

  • 命令格式
    unload from (<select_statement> ) 
    into 
    location <external_location>
    [row format serde '<serde_class>'
      [with serdeproperties (<Options>)]
    ]
    storeds as <file_format>;
  • 参数说明
    • select_statementselect查询子句,从源表(分区表或非分区表)中查询需要插入目标OSS路径的数据。更多select信息,请参见SELECT语法
    • external_location:必填。指定导出数据存储的目标OSS路径,格式为'oss://<oss_endpoint>/<object>'(方式一授权模式)或'oss://<AccessKey_Id>:<AccessKey_Secret>@<oss_endpoint>/<object>'(方式二授权模式)。更多OSS路径信息,请参见OSS访问域名使用规则
    • serde_class:可选。使用方法和MaxCompute外部表一致,请参见OSS外部表支持开源格式数据
      说明 开源格式导出的文件不支持添加后缀名。
      不同file format对应的serde class如下:
      • SEQUENCEFILE:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
      • TEXTFILE:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
      • RCFILE:org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe
      • ORC:org.apache.hadoop.hive.ql.io.orc.OrcSerde
      • ORCFILE:org.apache.hadoop.hive.ql.io.orc.OrcSerde
      • PARQUET:org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe
      • AVRO:org.apache.hadoop.hive.serde2.avro.AvroSerDe
    • Options:必填。指定源表相关参数,支持的属性和MaxCompute外部表一致。更多属性信息,请参见OSS外部表支持开源格式数据
    • file_format:必填。指定导出数据文件格式。例如ORC、PARQUET、RCFILE、SEQUENCEFILE和TEXTFILE。使用方法和MaxCompute外部表一致,请参见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   |
    +------------+-------------+-------------+------------+------------+
    1. 登录OSS管理控制台,创建OSS Bucket目录mc-unload/data_location/,区域为oss-cn-hangzhou,并组织OSS路径。更多创建OSS Bucket信息,请参见创建存储空间Bucket
      根据Bucket、区域、Endpoint信息组织OSS路径如下:
      oss://oss-cn-hangzhou-internal.aliyuncs.com/mc-unload/data_location
    2. 登录MaxCompute客户端,执行UNLOAD命令,将sale_detail表的数据导出至OSS,格式为PARQUET。命令示例如下:
      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::139699392458****:role/unload2oss') 
      stored as parquet;
    3. 登录OSS管理控制台,查看目标OSS路径的导入结果。导入结果