如果OSS上的数据为LZO或SNAPPY压缩格式,您需要在创建OSS外部表时,指定压缩格式相关信息。本文为您介绍如何创建OSS外部表,实现访问存储在OSS上的压缩格式数据或以压缩格式将数据写入OSS。

前提条件

请确认您已完成如下操作:
  • OSS授权。

    更多授权操作信息,请参见STS模式授权

  • 已准备好OSS存储空间(Bucket)、OSS目录及OSS数据文件。

    更多OSS存储空间操作信息,请参见创建存储空间

    更多新建OSS目录操作信息,请参见新建目录

    更多上传数据文件操作信息,请参见上传文件

背景信息

MaxCompute提供了OSS外部表对压缩为SNAPPY或LZO格式的TXETFILE类型数据文件(例如CSV、JSON、TEXT)的读写能力:
  • 如果TXETFILE类型数据文件为LZO压缩格式,OSS外部表会自动通过后缀名判断压缩算法,并读取数据。向OSS外部表写入LZO压缩格式数据时,需要在建表时添加LZO配置项。
  • 如果TXETFILE类型数据文件为SNAPPY压缩格式,OSS外部表会自动使用Hadoop默认的Hadoop-Snappy解压缩算法读取数据。向OSS外部表写入SNAPPY压缩格式数据同样需要在建表时添加SNAPPY配置项。您还可以使用Raw-Snappy压缩算法的配置项实现读写Raw-Snappy格式的压缩文件。

该方案的实现流程与访问开源格式数据流程相同,二者的区别在于创建OSS外部表时表属性设置不同。本文仅针对建表语法着重进行介绍,更多使用信息,请参见支持开源格式数据

创建外部表语法格式

create external table [if not exists] <mc_oss_extable_name>
(
<col_name> <date_type>,
...
)
[partitioned by (<col_name> <data_type>, ...)]
[row format serde '<serde_class>'
  [with serdeproperties (
    'odps.properties.rolearn'='<ram_arn>' 
    [,'<property_name>'='<property_value>'[,'<property_name>'='<property_value>'...]])
]
stored as <file_format>
location '<oss_location>'
[using '<resource_name>'];
[tblproperties ('<tbproperty_name>'='<tbproperty_value>',...)];

语法参数详细说明,请参见支持开源格式数据

您需要关注tblproperties属性的使用方法:tbproperty_name为外部表扩展信息属性名称,tbproperty_value为外部表扩展信息属性值。针对LZO或SNAPPY压缩格式的用法如下:
  • 如果OSS数据文件为LZO压缩格式,需要先通过set odps.sql.hive.compatible=true;命令打开Hive兼容开关:
    • 读取OSS数据:读取以.lzo或.lzo_deflate结尾的文件。创建OSS外部表时,无需其他设置,OSS外部表会自动通过后缀名判断文件的压缩方式,并读取数据。
    • 向OSS写入数据:默认向OSS写入数据时不压缩,如果您需要使用LZO算法压缩数据,需要在tblproperties中添加如下属性:
      --打开写压缩格式文件功能。
      'mcfed.mapreduce.output.fileoutputformat.compress'='true'
      --设置压缩格式属性,根据实际文件后缀配置其中之一即可。LzopCodec与lzop tool相互兼容,是最常用的处理LZO格式的codec。而LzoCodec处理pure LZO格式,这种格式采用.lzo_deflate作为文件后缀。
      'mcfed.mapreduce.output.fileoutputformat.compress.codec'='com.hadoop.compression.lzo.LzoCodec'
      'mcfed.mapreduce.output.fileoutputformat.compress.codec'='com.hadoop.compression.lzo.LzopCodec'
  • 如果OSS数据文件为SNAPPY压缩格式,需要先通过set odps.sql.hive.compatible=true;命令打开Hive兼容开关:
    • 读取OSS数据:在读取以.snappy结尾的文件时,将使用Hadoop默认的Hadoop-Snappy解压缩算法。由于通过阿里云OSS投递功能进行投递的压缩方式为Raw-Snappy,读取Raw-Snappy格式的数据时,您需要在tblproperties中添加'io.compression.codecs'='com.aliyun.odps.io.compress.SnappyRawCodec'属性。
    • 向OSS写入数据:默认向OSS写入数据时不压缩,如果您需要使用SNAPPY算法压缩数据,需要在tblproperties中添加如下属性:
      --打开写压缩格式文件功能。
      'mcfed.mapreduce.output.fileoutputformat.compress'='true'
      --如果压缩为Hadoop-Snappy格式需要添加如下属性。
      'mcfed.mapreduce.output.fileoutputformat.compress.codec'='org.apache.hadoop.io.compress.SnappyCodec'
      --如果压缩为Raw-Snappy格式需要添加如下属性。
      'mcfed.mapreduce.output.fileoutputformat.compress.codec'='com.aliyun.odps.io.compress.SnappyRawCodec'
      说明 因为Hadoop-Snappy以及Raw-Snappy压缩方式都采用.snappy作为其后缀名,所以不要混用两种方式,否则会导致数据解压缩不正确。

创建外部表语法示例

  • 示例1:用户将文本类型的日志数据,以LZO方式压缩。如果需要读取OSS上后缀为.lzo或.lzo_deflate的压缩格式数据,并支持向OSS以.lzo或.lzo_deflate压缩格式写入数据,则创建外部表的命令示例如下:
    --以.lzo压缩格式写入数据。
    create external table mz_lzo
        (a map<string, string>)
    stored as textfile
    location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test1/Demo2/'
    tblproperties('mcfed.mapreduce.output.fileoutputformat.compress'='true', 'mcfed.mapreduce.output.fileoutputformat.compress.codec'='com.hadoop.compression.lzo.LzopCodec');
    
    --以.lzo_deflate压缩格式写入数据。
    create external table mz_lzo
        (a map<string, string>)
    stored as textfile
    location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test1/Demo2/'
    tblproperties('mcfed.mapreduce.output.fileoutputformat.compress'='true', 'mcfed.mapreduce.output.fileoutputformat.compress.codec'='com.hadoop.compression.lzo.LzoCodec');
  • 示例2:用户将日志数据通过OSS日志投递功能投递到OSS上时,为方便解析以及控制存储成本,通常会存储为JSON字符串(例如,每一行是JSON格式)并采用Raw-Snappy方式压缩,压缩文件后缀为.snappy。如果需要读取OSS上的Raw-Snappy压缩格式数据,并支持向OSS以Raw-Snappy压缩格式写入数据,则创建外部表的命令示例如下:
    create external table mz_snappy
    (ss_sold_date_sk BIGINT,ss_sold_time_sk BIGINT,ss_item_sk BIGINT,ss_customer_sk BIGINT,ss_cdemo_sk BIGINT,ss_hdemo_sk BIGINT,ss_addr_sk BIGINT,ss_store_sk BIGINT,ss_promo_sk BIGINT,ss_ticket_number BIGINT,ss_quantity BIGINT,ss_wholesale_cost DECIMAL(7,2),ss_list_price DECIMAL(7,2),ss_sales_price DECIMAL(7,2),ss_ext_discount_amt DECIMAL(7,2),ss_ext_sales_price DECIMAL(7,2),ss_ext_wholesale_cost DECIMAL(7,2),ss_ext_list_price DECIMAL(7,2),ss_ext_tax DECIMAL(7,2),ss_coupon_amt DECIMAL(7,2),ss_net_paid DECIMAL(7,2),ss_net_paid_inc_tax DECIMAL(7,2),ss_net_profit DECIMAL(7,2))
    stored as textfile
    location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test1/Demo1/'
    tblproperties('io.compression.codecs'='com.aliyun.odps.io.compress.SnappyRawCodec', 'mcfed.mapreduce.output.fileoutputformat.compress'='true', 'mcfed.mapreduce.output.fileoutputformat.compress.codec'='com.aliyun.odps.io.compress.SnappyRawCodec');