开发者社区> 问答> 正文

Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE

你好,我们用的1.11版本。

需求:table t 有三个字段(a,b,c)

我们的场景只想根据主键a更新部分字段b,其余的字段c原有的值保持不变,

例如mysql 支持:

insert into t(a,b) select 1,2 on duplicate key update b=2;

主键重复的时候只更新字段b,字段c的值不变。

但是flink sql 目前只支持全字段更新:insert into t(a,b,c) select 1,2,3 。

我在sql-client测试了一下:insert into t(a,b) select 1,2 on duplicate key update

b=2; 会报错 不支持 on duplicate key update

同时也测试了一下:insert into t(a,b) select 1,2 也会报错,字段数量不匹配;

[ERROR] Could not execute SQL statement. Reason:

org.apache.flink.table.api.ValidationException: Column types of query

result and sink for registered table 'default_catalog.default_database.t'

do not match.

Cause: Different number of columns.

我查看了https://issues.apache.org/jira/browse/FLINK-18726

使用最新版的1.13 sql-client测试了一下 insert into t(a,b) select 1,2

,相比1.11版本报错,1.13可以执行成功.但是发现和文档中描述的一样,字段c会插入null。如果原有的一条数据是1,2,3执行sql后会变成1,2,null,会造成字段c的数据丢失,这是不允许的。

请问这种根据主键更新部分字段的场景 使用flink sql应该怎么处理?

在 2021-08-02 15:39:09,"silence" sl...@aliyun.com.INVALID 写道:

用的什么版本这个应该已经在1.13中修复了https://issues.apache.org/jira/browse/FLINK-18726

不行的话可以在ddl中限制列的数量*来自志愿者整理的flink邮件归档

展开
收起
彗星halation 2021-12-02 16:46:26 2503 0
1 条回答
写回答
取消 提交回答
  • 如果我沒有理解錯你的應用場景的話,你想達成的結果應該是類似這篇討論 [1] 裡提到的問題對吧?

    從最新的 flink 文檔 [2] 中來看應該無法透過你期望的 on duplicate key 語句來實現,

    或許可以嘗試在 SELECT 語句上達成,舉例來說你可以在原有的 select 語句之外多添加 group by,如下:

    insert into t select a, last_value(b ignore nulls) as b, last_value(c*来自志愿者整理的FLINK邮件归档

    2021-12-02 16:59:18
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载