【详述】FLink实时接入数据到StarRocks,其中有部分列更新的场景,接入的表是主键和排序键分开的,排序键需要更新,用FLink接入的时候报排序键不支持部分列更新,通过curl方式验证过,StreamLoad的方式是支持排序键部分列更新的
【StarRocks版本】3.0.7
【Flink Connector版本】flink-connector-starrocks-1.2.8_flink-1.13_2.11
麻烦发一下connector配置和curl的命令
表结构方便也发一下
curl :
curl --location-trusted -u root:ersfd -T ch1.txt -H “label: ch17” -H “column_separator:$” -H “partial_update:true” -H “columns:ID,CreateDate,BizDate” http://x.x.x.x:8030/api/OlapDB/ChargeBills_New1/_stream_load
connector配置:
CREATE TABLE ChargeBills_New (
ID varchar(36) NOT NULL COMMENT “”,
CreateDate date NOT NULL COMMENT “”,
CreateTime datetime NULL COMMENT “”,
BeginTime datetime NULL COMMENT “”,
CustID varchar(36) NULL COMMENT “”,
OperatorID varchar(36) NULL COMMENT “”,
BizDate date NULL COMMENT “”,
…
) PRIMARY KEY(ID, CreateDate) – 主键
PARTITION BY RANGE(CreateDate)
(PARTITION p202301 VALUES [(“2023-01-01”), (“2023-02-01”)),
PARTITION p202302 VALUES [(“2023-02-01”), (“2023-03-01”)),
PARTITION p202303 VALUES [(“2023-03-01”), (“2023-04-01”)),
PARTITION p202304 VALUES [(“2023-04-01”), (“2023-05-01”)),
PARTITION p202305 VALUES [(“2023-05-01”), (“2023-06-01”)),
PARTITION p202306 VALUES [(“2023-06-01”), (“2023-07-01”)),
PARTITION p202307 VALUES [(“2023-07-01”), (“2023-08-01”)),
PARTITION p202308 VALUES [(“2023-08-01”), (“2023-09-01”)))
DISTRIBUTED BY HASH(ID) BUCKETS 16
ORDER BY(BizDate) --排序键
PROPERTIES (
“replication_num” = “3”,
“dynamic_partition.enable” = “true”,
“dynamic_partition.time_unit” = “MONTH”,
“dynamic_partition.end” = “1”,
“dynamic_partition.prefix” = “p”,
“dynamic_partition.buckets” = “16”,
“enable_persistent_index” = “true”
);
这个报错输出的不够准确。准确的约束是部分列更新的时候需要提供完整的排序列,我看你flink任务里没有提供BizDate这一列,所以报错了
部分列更新,不一定能是按照顺序的,中间会有断的,而且这个业务需要多次更新不同的列
BizDate也会更新,但是只有一次更新,其他更新的时候是更新其他列,不会更新这个列了
现在部分列更新有一个限制,是需要提供完整的排序列,在你这张表里就是需要提供BizDate这一列
换句话说我们一条完整的数据,需要经过好几轮的更新,每一轮更新的列不同
那这个有点麻烦了
那update语句底层逻辑不是部分列更新吗?update语句可以更新其他的列
update语句是没有这个约束的,update语句的底层实现逻辑和这个稍微有点出入。现在部分列更新的这个约束后面也是有计划要优化的,但是暂时还没有来得及优化。
好的,我们先临时处理一下,感谢支持
错误信息可以再优化一些,会有误读的情况

