数据重排

在MaxCompute的使用过程中,如果已经积累了大量数据占用了大量存储资源,且已经通过削减数据存储生命周期和删除非必要数据等方式进行了治理,在您的存储预算有限,计算资源还有冗余的情况下,可以考虑使用数据重排方式对存储空间进行优化。本文以MaxCompute公共数据集中表为例为您介绍如何通过数据重排方式进行存储优化。

背景信息

数据重排就是根据数据的特征把具有相同列值字段通过排序放在一块,以提高压缩率。MaxCompute中支持以下排序方式对数据进行重排:

因为ORDER BY是全局排序,对计算性能的开销较大,而且集中在单个Reduce上排序并不能起到分布式处理的效果,所以可以通过DISTRIBUTE BY+SORT BYCLUSTER BY两种方式来进行数据重排。

注意事项

  • 进行数据重排会占用和消耗计算资源,如果您的实例为按量付费规格,将产生计算费用,请您根据实际情况评估是否通过数据重排方式进行存储优化。

  • 使用DISTRIBUTE BY+SORT BYCLUSTER BY排序方法进行数据排序前请查看表中数值的分布情况,对列值占比大的列进行重排,存储优化效果会比较好。

  • 表数据越大,进行数据重排后,存储优化效果会更好。

使用示例

本文将MaxCompute公共数据集TPC-DS中1 TB规格的customer表分别以DISTRIBUTE BY+SORT BYCLUSTER BY两种排序方法重排后写入新的数据表,比较写入前后表的大小以验证存储优化效果,MaxCompute公共数据集TPC-DS详情请参见TPC-DS数据。步骤如下:

  1. 创建数据接收表。

    使用如下命令创建数据接收表storage_test1storage_test2

    create table if not exists <storage_test1|storage_test2>(
    c_customer_sk bigint,
    c_customer_id char(16),
    c_current_cdemo_sk bigint,
    c_current_hdemo_sk bigint,
    c_current_addr_sk bigint,
    c_first_shipto_date_sk bigint,
    c_first_sales_date_sk bigint,
    c_salutation char(10),
    c_first_name char(20),
    c_last_name char(30),
    c_preferred_cust_flag char(1),
    c_birth_day bigint,
    c_birth_month bigint,
    c_birth_year bigint,
    c_birth_country varchar(20),
    c_login char(13),
    c_email_address char(50),
    c_last_review_date_sk char(10)
    );
  2. 数据重排。

    使用如下命令将TPC-DS公共数据集中customer表的数据排序后写入到数据接收表。

    说明

    重排前请查看表中数值的分布情况,对列值占比大的列进行重排效果会比较好(customer表中c_email_address字段列值占比较大)。

    • 使用DISTRIBUTE BY+SORT BY方式进行数据重排:

      SET odps.namespace.schema = true;
      insert overwrite table storage_test1 
      select * from bigdata_public_dataset.tpcds_1t.customer 
      distribute by c_email_address 
      sort by c_email_address;
    • 使用CLUSTER BY方式进行重排:

      说明

      使用CLUSTER BY方式进行重排后,可能会出现在部分场景下不支持实时插入数据的情况。

      SET odps.namespace.schema = true;
      insert overwrite table storage_test2 
      select * from bigdata_public_dataset.tpcds_1t.customer 
      cluster by c_email_address;
  3. 数据重排效果验证。

    使用如下DESC命令,分别查看bigdata_public_dataset.tpcds_1t.customer和数据接收表storage_test1storage_test2的表大小,DESC命令详情请参见DESC TABLE/VIEW

    • SET odps.namespace.schema = true;
      desc bigdata_public_dataset.tpcds_1t.customer;

      返回表大小为:469939587 bytes。

    • desc storage_test1;

      返回表大小为: 449472614 bytes。

    • desc storage_test2;

      返回表大小为:449565021 bytes。

    使用DISTRIBUTE BY+SORT BY方式重排数据,存储优化了约4.355%((469939587-449472614)/469939587*100%)。

    使用CLUSTER BY方式重排数据,存储优化了约4.336%((469939587-449565021)/469939587*100%)。