全部產品
Search
文件中心

MaxCompute:UNLOAD

更新時間:Jun 19, 2024

MaxCompute支援您將MaxCompute專案中的資料匯出至外部儲存(OSS、Hologres),以供其他計算引擎使用。本文為您介紹UNLOAD命令的使用方法及具體樣本。

本文中的命令您可以在如下工具平台執行:

功能介紹

MaxCompute支援使用unload命令將MaxCompute的資料匯出至OSSHologres外部儲存,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_statementselect查詢子句,從源表(分區表或非分區表)中查詢需要插入目標OSS路徑的資料。更多select資訊,請參見SELECT文法

    • table_namept_spec:使用表名稱或表名稱加分區名稱的方式指定需要匯出的資料。該匯出方式不產生查詢語句,不會產生費用。pt_spec格式為(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)

    • external_location:必填。指定匯出資料存放區的目標OSS路徑,格式為'oss://<oss_endpoint>/<object>'。更多OSS路徑資訊,請參見OSS訪問網域名稱使用規則

    • StorageHandler:必填。指定內建的StorageHandler名稱。固定取值為com.aliyun.odps.CsvStorageHandlercom.aliyun.odps.TsvStorageHandler,是內建的處理CSV、TSV格式檔案的StorageHandler,定義了如何讀或寫CSV、TSV檔案。相關邏輯已經由系統實現,您只需要指定該參數。此方法匯出的檔案預設添加.csv.tsv尾碼名。使用方法和MaxCompute外部表格一致,請參見建立OSS外部表格

    • <property_name>'='<property_value>':可選。property_name為屬性名稱,property_value為屬性值。支援的屬性和MaxCompute外部表格一致。更多屬性資訊,請參見建立OSS外部表格

    外部儲存:Hologres

    • select_statementselect查詢子句,從源表(非分區表)中查詢需要插入目標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   |
    +------------+-------------+-------------+------------+------------+
    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。命令樣本如下:

      • 樣本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::139699392458****: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::139699392458****: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::139699392458****:role/AliyunODPSDefaultRole', 'odps.text.option.gzip.output.enabled'='true');

      'odps.text.option.gzip.output.enabled'='true'用於指定匯出檔案為GZIP壓縮格式,當前僅支援GZIP壓縮格式。

    3. 登入OSS管理主控台,查看目標OSS路徑的匯入結果。

      • 樣本1結果如下。匯入結果

      • 樣本2結果如下。匯入結果

    外部儲存:Hologres

    假設將MaxCompute專案中表data_test的資料匯出至Hologres。data_test的資料如下:

    +------------+------+
    | id         | name |
    +------------+------+
    | 3          | rgege |
    | 4          | Gegegegr |
    +------------+------+
    1. 在Hologres建立資料接收表mc_2_holo(所在資料庫名稱為test),您可以在HoloWeb的SQL編輯器中執行建表語句,詳情請參見串連HoloWeb。建表語句如下:

      說明

      資料接收表的欄位類型需與MaxCompute表欄位類型對應,詳情請參見MaxCompute與Hologres的資料類型映射

      create table mc_2_holo (id int, name text);
    2. 登入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&currentSchema=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'
      );
    3. 在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>',...)]
    ]
    storeds as <file_format>
    [properties('<tbproperty_name>'='<tbproperty_value>')];
  • 參數說明

    • select_statementselect查詢子句,從源表(分區表或非分區表)中查詢需要插入目標OSS路徑的資料。更多select資訊,請參見SELECT文法

    • table_namept_spec:使用表名稱或表名稱加分區名稱的方式指定需要匯出的資料。該匯出方式不產生查詢語句,不會產生費用。pt_spec格式為(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)

    • external_location:必填。指定匯出資料存放區的目標OSS路徑,格式為'oss://<oss_endpoint>/<object>'。更多OSS路徑資訊,請參見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壓縮格式,設定壓縮屬性為'mcfed.parquet.compression'='SNAPPY''mcfed.parquet.compression'='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   |
    +------------+-------------+-------------+------------+------------+
    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。命令樣本如下:

      • 樣本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::139699392458****: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::139699392458****:role/AliyunODPSDefaultRole') 
        stored as parquet 
        properties('mcfed.parquet.compression'='SNAPPY');
    3. 登入OSS管理主控台,查看目標OSS路徑的匯入結果。

      • 樣本1結果如下。匯入結果

      • 樣本2結果如下。匯入結果

      說明

      以SNAPPY或LZO壓縮格式匯出資料時,匯出檔案不支援顯示.snappy或.lzo尾碼名。

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>',...)];
      • 設定首碼的property_name為:odps.external.data.prefix,值可以自訂,長度不超過10個字元。

      • 設定尾碼的property_name為:odps.external.data.enable.extension,值為true即尾碼顯示檔案格式。

      • 其他參數請參見通過內建Extractor匯出(StorageHandler)

    • 匯出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>',...)]
      ]
      storeds as <file_format>
      [properties('<tbproperty_name>'='<tbproperty_value>')];
      • 設定首碼的tbproperty_name為:odps.external.data.prefix,值可以自訂,長度不超過10個字元。

      • 設定尾碼的tbproperty_name為: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格式檔案,並添加mf_首碼和尾碼。

      set odps.sql.hive.compatible=true;
      set odps.sql.split.hive.bridge=true;
      unload from (select col_tinyint,col_binary from mf_fun_datatype limit 1)
      into
      location 'oss://oss-cn-beijing-internal.aliyuncs.com/mfosscostfee/demo6/'
      stored as textfile
      properties ('odps.external.data.prefix'='mf_', 'odps.external.data.enable.extension'='true');

      在指定匯出資料存放區的目標OSS路徑查看匯出結果。

    • 匯出csv格式檔案,並添加mf_首碼和尾碼。

      set odps.sql.hive.compatible=true;
      set odps.sql.split.hive.bridge=true;
      unload from (select col_tinyint,col_binary from mf_fun_datatype limit 2)
      into
      location 'oss://oss-cn-beijing-internal.aliyuncs.com/mfosscostfee/demo6/'
      stored by 'com.aliyun.odps.CsvStorageHandler'
      properties ('odps.external.data.prefix'='mf_', 'odps.external.data.enable.extension'='true');
      

      在指定匯出資料存放區的目標OSS路徑查看匯出結果。

相關文檔

若您希望將外部儲存上的CVS格式或其他開源格式資料匯入至MaxCompute,請參見LOAD