若用户将数据以分区目录的方式进行存储,可以减少 DLC 计算任务的数据扫描量,大幅度提升运算性能。对数据进行分区最常见的做法是将数据按照时间存储到不同目录下,例如,将同一天产生的数据放到一个目录下,可以按照“年-月-日”组织多层数据目录。DLC 中的同一个表及其分区必须使用相同的数据格式。
创建分区表
添加分区数据
在创建数据表时指定分区仅是配置了分区字段,不能立刻执行查询语句获取数据。用户需要将分区数据添加至数据表。若有新的分区数据添加至数据目录,则需要添加分区信息到数据表。
手动添加分区
使用
ALTER TABLE ADD PARTITIO
语句,会把指定的分区目录添加至数据表。若区目录兼容 Hive 的分区规则(分区列名 = 分区列值),则无需指定数据路径。否则,需要显示指定数据路径。详情可参见 SQL 语法。示例1:单个分区目录,分区目录符合。
ALTER TABLE tabel_demo ADDPARTITION (dt = '2021-01-01');
示例2:多层分区目录嵌套
ALTER TABLE tabel_demo ADDPARTITION (year = '2021', month='01', day='01');
示例3:显示指定分区路径
ALTER TABLE tabel_demo ADDPARTITION (year = '2021', month='01', day='01') LOCATION 'cosn://tablea_demo' ;
自动添加分区
MSCK REPAIR TABLE table_demo
系统约束
MSCK REPAIR TABLE
仅向数据表元数据添加分区,不会删除它们。想要删除已经添加的分区,可执行语句 ALTER TABLE table-name DROP PARTITION
。详情请参见 SQL 语法。若数据量非常大,MSCK REPAIR TABLE 不是推荐的方案。系统会扫描全量数据,并且消耗很长的时间,可能会导致任务超时,使得数据表的分区信息处于不完整状态。
分区目录必须兼容 Hive 的分区规则:分区列名=分区列值,若不一致,请使用
ALTER TABLE ADD PARTITION
加载分区。详情请参见 SQL 语法。请确保在单独的文件夹层次结构中保留单独表的数据。例如,假设 COS 服务中有表 A 的数据
cosn://tablea_a
和表 B 的数据cosn://tablea_a/tablea_b
,如果两个表都按字符串进行分区,MSCK REPAIR TABLE
会将表 B 的分区添加到表 A。为了避免这种情况,请使用单独的文件夹结构,如cosn://tablea_a
和cosn://tablea_b
。该语句可能会导致 COS 服务的数据读写开销,可参见 COS 服务的收费标准。