在MaxCompute的使用过程中,如果已经积累了大量数据占用了大量存储资源,且已经通过削减数据存储生命周期和删除非必要数据等方式进行了治理,在您的存储预算有限,计算资源还有冗余的情况下,可以考虑使用数据重排方式对存储空间进行优化。本文以MaxCompute公共数据集中表为例为您介绍如何通过数据重排方式进行存储优化。
背景信息
数据重排就是根据数据的特征把具有相同列值字段通过排序放在一块,以提高压缩率。MaxCompute中支持以下排序方式对数据进行重排:
ORDER BY:全局排序,将数据全部放到一个Reducer排序,详情请参见ORDER BY全局排序(order_condition)。
DISTRIBUTE BY:控制Map结果的分发,它会将具有相同字段的Map输出分发到同一个Reducer上做处理,详情请参见DISTRIBUTE BY哈希分片(distribute_condition)。
SORT BY:局部排序,其在数据进入Reducer前完成排序,只能保证一个Reducer内的数据是按照指定字段排序,详情请参见SORT BY局部排序(sort_condition)。
CLUSTER BY : 可以理解为DISTRIBUTE BY和SORT BY某个特定字段,而且只能升序排列。
因为ORDER BY是全局排序,对计算性能的开销较大,而且集中在单个Reduce上排序并不能起到分布式处理的效果,所以可以通过DISTRIBUTE BY+SORT BY
和CLUSTER BY
两种方式来进行数据重排。
注意事项
进行数据重排会占用和消耗计算资源,如果您的实例为按量付费规格,将产生计算费用,请您根据实际情况评估是否通过数据重排方式进行存储优化。
使用
DISTRIBUTE BY+SORT BY
、CLUSTER BY
排序方法进行数据排序前请查看表中数值的分布情况,对列值占比大的列进行重排,存储优化效果会比较好。表数据越大,进行数据重排后,存储优化效果会更好。
使用示例
本文将MaxCompute公共数据集TPC-DS中1 TB规格的customer
表分别以DISTRIBUTE BY+SORT BY
、CLUSTER BY
两种排序方法重排后写入新的数据表,比较写入前后表的大小以验证存储优化效果,MaxCompute公共数据集TPC-DS详情请参见TPC-DS数据。步骤如下:
创建数据接收表。
使用如下命令创建数据接收表
storage_test1
和storage_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) );
数据重排。
使用如下命令将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;
数据重排效果验证。
使用如下DESC命令,分别查看
bigdata_public_dataset.tpcds_1t.customer
和数据接收表storage_test1
、storage_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%
)。