关于动态分区与自动分区的建议。

Viewed 108

当前版本:2.1.4

生产场景:需要按天,平台字段进行幂等更新。

举例:当前有几个 job 需要同时更新同一张表。表设计如下

CREATE TABLE `dialog_eval_stat` (
  `seller_nick` VARCHAR(65533) NULL,
  `snick` VARCHAR(65533) NULL,
  `day` INT NULL,
  `platform` VARCHAR(65533) NULL,
  `eval_code` INT NULL,
  `eval_cnt` BIGINT NULL,
  `dialog_cnt` BIGINT NULL
) ENGINE = OLAP DUPLICATE KEY(`seller_nick`, `snick`) AUTO PARTITION BY LIST (platform)(day) (
) DISTRIBUTED BY HASH(`seller_nick`, `snick`) BUCKETS AUTO PROPERTIES (
  "replication_allocation" = "tag.location.default: 3",
  "min_load_replica_num" = "-1",
  "is_being_synced" = "false",
  "storage_medium" = "hdd",
  "storage_format" = "V2",
  "inverted_index_storage_format" = "V1",
  "light_schema_change" = "true",
  "disable_auto_compaction" = "false",
  "enable_single_replica_compaction" = "false",
  "group_commit_interval_ms" = "10000",
  "group_commit_data_bytes" = "134217728"
);

问题 1: 自动分区 和 动态分区 两个分区命名方式不一样
自动分区:p202407128 ,当增加字段如 tb 则变成 ptb2202407128(p + col1 + col1字符串长度 +col2 + col2字符串长度 )
动态分区:p20240712
使用体验比较割裂。

问题 2: TRUNCATE/INSERT OVERWRITE 不存在的分区会报错

TRUNCATE TABLE  xqc_dws.dialog_eval_stat PARTITION(pks2202407168) 

在使用体验中感觉不太便利,希望清空不存在的分区不会报错,或 if not exists 来不处理。

TRUNCATE TABLE  xqc_dws.dialog_eval_stat PARTITION(pks2202407168) if not exists 

问题 3: TRUNCATE/INSERT OVERWRITE 对分区处理时不太便利

能否合并动态分区/自动分区功能,统一管理分区。

其他:
image.png
问题描述:在修改分区时触发的一个bug,导致 BE 宕机,没有自动重启,此问题非稳定复现。

2 Answers
  1. 自动分区有特殊的命名规则,是因为分区名在Doris中有特殊含义,我们分区的自动创建依赖这一点。之后我们会支持一个partitionName的函数,使这一块儿使用更加便利。
  2. 这个我们后续考虑支持下,但考虑到不影响实际功能,可能不会立刻支持
  3. TRUNCATE/INSERT OVERWRITE 对分区处理时不太便利——这块儿具体指的是啥呢?我们可以下来分析下
  4. 如果BE出现宕机,可以从be.out中看到core栈,根据core栈和coredump文件我们可以做进一步分析

回复答复:TRUNCATE/INSERT OVERWRITE 对分区处理时不太便利——这块儿具体指的是啥呢?我们可以下来分析下

场景 : 大数据更新数据常常遇到更新分区的数据,为了保证数据幂等。需要进行如下操作
需要删除带有变量的分区的数据。

TRUNCATE TABLE  xqc_dws.dialog_eval_stat PARTITION(p{{platform}}2{{ds_nodash}}8)
INSERT OVERWRITE TABLE  xqc_dws.dialog_eval_stat 
PARTITION(p{{platform}}2{{ds_nodash}}8)
SELECT * FROM table_name

当分区不存在时会报错。

建议:
写入时:如果分区不存在时创建分区,然后写入数据
删除时:如果分区不存在,则不返回错误。

参考:if not exists 这种写法。

TRUNCATE TABLE  xqc_dws.dialog_eval_stat PARTITION(pks2202407168) if not exists