You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-zh@flink.apache.org by Ye Chen <ch...@163.com> on 2021/07/30 09:50:36 UTC

场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?

现有table 
CREATE TABLE t (
 a        bigint,
 b        bigint,
 c        bigint,
  PRIMARY KEY (a) NOT ENFORCED
) WITH (
...
);


我们的场景只想根据主键a更新部分字段b,其余的字段保持不变,例如
mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key update b='4';
主键重复的时候只更新字段b,字段c的值不变


我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
请问这种部分字段更新的场景 使用flink sql应该怎么处理?


Re:Re: 回复:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?

Posted by Ye Chen <ch...@163.com>.
需求:现有table t 三个字段
CREATE TABLE t (
 a        bigint,
 b        bigint,
 c        bigint,
 PRIMARY KEY (a) NOT ENFORCED
) WITH (
...
);
我们的场景只想根据主键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.请问这种根据主键更新部分字段的场景 使用flink sql应该怎么处理?















在 2021-08-02 14:35:04,"Shengkai Fang" <fs...@gmail.com> 写道:
>Flink 暂时不支持这个功能,可能需要自己改一下 jdbc connector 相关的代码.
>
>但是这个报错很奇怪..你 sql 咋写的
>
>Ye Chen <ch...@163.com> 于2021年8月2日周一 上午11:37写道:
>
>> 你好,我试了一下,如果表的ddl是三个字段,但是insert只指定两个字段的话,会报错:
>> [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.
>> 我们的需求是想根据主键更新部分字段
>>
>> -------------------------------------
>>
>> 需求:现有table
>> CREATE TABLE t (
>>  a        bigint,
>>  b        bigint,
>>  c        bigint,
>>   PRIMARY KEY (a) NOT ENFORCED
>> ) WITH (
>> ...
>> );
>> 我们的场景只想根据主键a更新部分字段b,其余的字段c保持不变,
>> 例如mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key
>> update b='4';主键重复的时候只更新字段b,字段c的值不变。
>> 我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
>> 请问这种根据主键更新部分字段的场景 使用flink sql应该怎么处理?
>>
>>
>>
>>
>>
>>
>>
>> 在 2021-08-02 10:47:55,"silence" <sl...@aliyun.com.INVALID> 写道:
>> >如果只想更新部分字段的话可以试下
>> >insert into t(a,b) select a,b from xxxxx
>> >
>> >
>> >------------------------------------------------------------------
>> >发件人:Ye Chen <ch...@163.com>
>> >发送时间:2021年7月30日(星期五) 17:57
>> >收件人:user-zh <us...@flink.apache.org>
>> >主 题:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?
>> >
>> >现有table
>> >CREATE TABLE t (
>> > a        bigint,
>> > b        bigint,
>> > c        bigint,
>> >  PRIMARY KEY (a) NOT ENFORCED
>> >) WITH (
>> >...
>> >);
>> >
>> >
>> >我们的场景只想根据主键a更新部分字段b,其余的字段保持不变,例如
>> >mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key
>> update b='4';
>> >主键重复的时候只更新字段b,字段c的值不变
>> >
>> >
>> >我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
>> >请问这种部分字段更新的场景 使用flink sql应该怎么处理?
>> >
>> >
>>

Re: 回复:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?

Posted by Shengkai Fang <fs...@gmail.com>.
Flink 暂时不支持这个功能,可能需要自己改一下 jdbc connector 相关的代码.

但是这个报错很奇怪..你 sql 咋写的

Ye Chen <ch...@163.com> 于2021年8月2日周一 上午11:37写道:

> 你好,我试了一下,如果表的ddl是三个字段,但是insert只指定两个字段的话,会报错:
> [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.
> 我们的需求是想根据主键更新部分字段
>
> -------------------------------------
>
> 需求:现有table
> CREATE TABLE t (
>  a        bigint,
>  b        bigint,
>  c        bigint,
>   PRIMARY KEY (a) NOT ENFORCED
> ) WITH (
> ...
> );
> 我们的场景只想根据主键a更新部分字段b,其余的字段c保持不变,
> 例如mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key
> update b='4';主键重复的时候只更新字段b,字段c的值不变。
> 我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
> 请问这种根据主键更新部分字段的场景 使用flink sql应该怎么处理?
>
>
>
>
>
>
>
> 在 2021-08-02 10:47:55,"silence" <sl...@aliyun.com.INVALID> 写道:
> >如果只想更新部分字段的话可以试下
> >insert into t(a,b) select a,b from xxxxx
> >
> >
> >------------------------------------------------------------------
> >发件人:Ye Chen <ch...@163.com>
> >发送时间:2021年7月30日(星期五) 17:57
> >收件人:user-zh <us...@flink.apache.org>
> >主 题:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?
> >
> >现有table
> >CREATE TABLE t (
> > a        bigint,
> > b        bigint,
> > c        bigint,
> >  PRIMARY KEY (a) NOT ENFORCED
> >) WITH (
> >...
> >);
> >
> >
> >我们的场景只想根据主键a更新部分字段b,其余的字段保持不变,例如
> >mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key
> update b='4';
> >主键重复的时候只更新字段b,字段c的值不变
> >
> >
> >我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
> >请问这种部分字段更新的场景 使用flink sql应该怎么处理?
> >
> >
>

Re: 回复:回复:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?

Posted by Tony Wei <to...@gmail.com>.
補充一下,從代碼上來看, last_value 原本的實現似乎就是獲取 last "non-null" value 了。

https://github.com/apache/flink/blob/master/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/aggfunctions/LastValueAggFunction.java

Tony Wei <to...@gmail.com> 於 2021年8月2日 週一 下午5:33寫道:

> 你好,
>
> 如果我沒有理解錯你的應用場景的話,你想達成的結果應該是類似這篇討論 [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
>> ignore nulls) as c from $(original_select_statement) group by a;
>
>
> 不過目前 last_value 似乎不支持 ignore nulls,你可以考慮自己實現一個 UDAF 來達成。
> 另外,這樣的做法也會造成 flink state 不斷增長 (由於 group by 的緣故),所以需要多加小心,比如適當的配置 state ttl。
>
> best regards,
>
> [1]
> https://stackoverflow.com/questions/48144641/mysql-using-on-duplicate-key-update-coalesce
> [2]
> https://ci.apache.org/projects/flink/flink-docs-master/docs/dev/table/sql/insert/#syntax
>
> Ye Chen <ch...@163.com> 於 2021年8月2日 週一 下午4:08寫道:
>
>> 你好,我们用的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中限制列的数量
>> >
>> >
>> >------------------------------------------------------------------
>> >发件人:Ye Chen <ch...@163.com>
>> >发送时间:2021年8月2日(星期一) 11:37
>> >收件人:user-zh <us...@flink.apache.org>; silence <sl...@aliyun.com>
>> >主 题:Re:回复:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?
>> >
>> >你好,我试了一下,如果表的ddl是三个字段,但是insert只指定两个字段的话,会报错:
>> >[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.
>> >我们的需求是想根据主键更新部分字段
>> >-------------------------------------
>> >需求:现有table
>> >CREATE TABLE t (
>> > a        bigint,
>> > b        bigint,
>> > c        bigint,
>> >  PRIMARY KEY (a) NOT ENFORCED
>> >) WITH (
>> >...
>> >);
>> >我们的场景只想根据主键a更新部分字段b,其余的字段c保持不变,
>> >例如mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key
>> update b='4';主键重复的时候只更新字段b,字段c的值不变。
>> >我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
>> >请问这种根据主键更新部分字段的场景 使用flink sql应该怎么处理?
>> >
>> >
>> >在 2021-08-02 10:47:55,"silence" <sl...@aliyun.com.INVALID> 写道:
>> >>如果只想更新部分字段的话可以试下
>> >>insert into t(a,b) select a,b from xxxxx
>> >>
>> >>
>> >>------------------------------------------------------------------
>> >>发件人:Ye Chen <ch...@163.com>
>> >>发送时间:2021年7月30日(星期五) 17:57
>> >>收件人:user-zh <us...@flink.apache.org>
>> >>主 题:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?
>> >>
>> >>现有table
>> >>CREATE TABLE t (
>> >> a        bigint,
>> >> b        bigint,
>> >> c        bigint,
>> >>  PRIMARY KEY (a) NOT ENFORCED
>> >>) WITH (
>> >>...
>> >>);
>> >>
>> >>
>> >>我们的场景只想根据主键a更新部分字段b,其余的字段保持不变,例如
>> >>mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key
>> update b='4';
>> >>主键重复的时候只更新字段b,字段c的值不变
>> >>
>> >>
>> >>我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
>> >>请问这种部分字段更新的场景 使用flink sql应该怎么处理?
>> >>
>> >>
>> >
>> >
>> >
>>
>

Re:Re: 回复:回复:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?

Posted by Ye Chen <ch...@163.com>.
非常感谢,受益良多。

best regards











在 2021-08-02 17:33:14,"Tony Wei" <to...@gmail.com> 写道:
>你好,
>
>如果我沒有理解錯你的應用場景的話,你想達成的結果應該是類似這篇討論 [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
>> ignore nulls) as c from $(original_select_statement) group by a;
>
>
>不過目前 last_value 似乎不支持 ignore nulls,你可以考慮自己實現一個 UDAF 來達成。
>另外,這樣的做法也會造成 flink state 不斷增長 (由於 group by 的緣故),所以需要多加小心,比如適當的配置 state ttl。
>
>best regards,
>
>[1]
>https://stackoverflow.com/questions/48144641/mysql-using-on-duplicate-key-update-coalesce
>[2]
>https://ci.apache.org/projects/flink/flink-docs-master/docs/dev/table/sql/insert/#syntax
>
>Ye Chen <ch...@163.com> 於 2021年8月2日 週一 下午4:08寫道:
>
>> 你好,我们用的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中限制列的数量
>> >
>> >
>> >------------------------------------------------------------------
>> >发件人:Ye Chen <ch...@163.com>
>> >发送时间:2021年8月2日(星期一) 11:37
>> >收件人:user-zh <us...@flink.apache.org>; silence <sl...@aliyun.com>
>> >主 题:Re:回复:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?
>> >
>> >你好,我试了一下,如果表的ddl是三个字段,但是insert只指定两个字段的话,会报错:
>> >[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.
>> >我们的需求是想根据主键更新部分字段
>> >-------------------------------------
>> >需求:现有table
>> >CREATE TABLE t (
>> > a        bigint,
>> > b        bigint,
>> > c        bigint,
>> >  PRIMARY KEY (a) NOT ENFORCED
>> >) WITH (
>> >...
>> >);
>> >我们的场景只想根据主键a更新部分字段b,其余的字段c保持不变,
>> >例如mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key
>> update b='4';主键重复的时候只更新字段b,字段c的值不变。
>> >我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
>> >请问这种根据主键更新部分字段的场景 使用flink sql应该怎么处理?
>> >
>> >
>> >在 2021-08-02 10:47:55,"silence" <sl...@aliyun.com.INVALID> 写道:
>> >>如果只想更新部分字段的话可以试下
>> >>insert into t(a,b) select a,b from xxxxx
>> >>
>> >>
>> >>------------------------------------------------------------------
>> >>发件人:Ye Chen <ch...@163.com>
>> >>发送时间:2021年7月30日(星期五) 17:57
>> >>收件人:user-zh <us...@flink.apache.org>
>> >>主 题:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?
>> >>
>> >>现有table
>> >>CREATE TABLE t (
>> >> a        bigint,
>> >> b        bigint,
>> >> c        bigint,
>> >>  PRIMARY KEY (a) NOT ENFORCED
>> >>) WITH (
>> >>...
>> >>);
>> >>
>> >>
>> >>我们的场景只想根据主键a更新部分字段b,其余的字段保持不变,例如
>> >>mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key
>> update b='4';
>> >>主键重复的时候只更新字段b,字段c的值不变
>> >>
>> >>
>> >>我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
>> >>请问这种部分字段更新的场景 使用flink sql应该怎么处理?
>> >>
>> >>
>> >
>> >
>> >
>>

Re: 回复:回复:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?

Posted by Tony Wei <to...@gmail.com>.
你好,

如果我沒有理解錯你的應用場景的話,你想達成的結果應該是類似這篇討論 [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
> ignore nulls) as c from $(original_select_statement) group by a;


不過目前 last_value 似乎不支持 ignore nulls,你可以考慮自己實現一個 UDAF 來達成。
另外,這樣的做法也會造成 flink state 不斷增長 (由於 group by 的緣故),所以需要多加小心,比如適當的配置 state ttl。

best regards,

[1]
https://stackoverflow.com/questions/48144641/mysql-using-on-duplicate-key-update-coalesce
[2]
https://ci.apache.org/projects/flink/flink-docs-master/docs/dev/table/sql/insert/#syntax

Ye Chen <ch...@163.com> 於 2021年8月2日 週一 下午4:08寫道:

> 你好,我们用的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中限制列的数量
> >
> >
> >------------------------------------------------------------------
> >发件人:Ye Chen <ch...@163.com>
> >发送时间:2021年8月2日(星期一) 11:37
> >收件人:user-zh <us...@flink.apache.org>; silence <sl...@aliyun.com>
> >主 题:Re:回复:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?
> >
> >你好,我试了一下,如果表的ddl是三个字段,但是insert只指定两个字段的话,会报错:
> >[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.
> >我们的需求是想根据主键更新部分字段
> >-------------------------------------
> >需求:现有table
> >CREATE TABLE t (
> > a        bigint,
> > b        bigint,
> > c        bigint,
> >  PRIMARY KEY (a) NOT ENFORCED
> >) WITH (
> >...
> >);
> >我们的场景只想根据主键a更新部分字段b,其余的字段c保持不变,
> >例如mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key
> update b='4';主键重复的时候只更新字段b,字段c的值不变。
> >我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
> >请问这种根据主键更新部分字段的场景 使用flink sql应该怎么处理?
> >
> >
> >在 2021-08-02 10:47:55,"silence" <sl...@aliyun.com.INVALID> 写道:
> >>如果只想更新部分字段的话可以试下
> >>insert into t(a,b) select a,b from xxxxx
> >>
> >>
> >>------------------------------------------------------------------
> >>发件人:Ye Chen <ch...@163.com>
> >>发送时间:2021年7月30日(星期五) 17:57
> >>收件人:user-zh <us...@flink.apache.org>
> >>主 题:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?
> >>
> >>现有table
> >>CREATE TABLE t (
> >> a        bigint,
> >> b        bigint,
> >> c        bigint,
> >>  PRIMARY KEY (a) NOT ENFORCED
> >>) WITH (
> >>...
> >>);
> >>
> >>
> >>我们的场景只想根据主键a更新部分字段b,其余的字段保持不变,例如
> >>mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key
> update b='4';
> >>主键重复的时候只更新字段b,字段c的值不变
> >>
> >>
> >>我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
> >>请问这种部分字段更新的场景 使用flink sql应该怎么处理?
> >>
> >>
> >
> >
> >
>

Re:回复:回复:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?

Posted by Ye Chen <ch...@163.com>.
你好,我们用的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中限制列的数量
>
>
>------------------------------------------------------------------
>发件人:Ye Chen <ch...@163.com>
>发送时间:2021年8月2日(星期一) 11:37
>收件人:user-zh <us...@flink.apache.org>; silence <sl...@aliyun.com>
>主 题:Re:回复:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?
>
>你好,我试了一下,如果表的ddl是三个字段,但是insert只指定两个字段的话,会报错:
>[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.
>我们的需求是想根据主键更新部分字段
>-------------------------------------
>需求:现有table 
>CREATE TABLE t (
> a        bigint,
> b        bigint,
> c        bigint,
>  PRIMARY KEY (a) NOT ENFORCED
>) WITH (
>...
>);
>我们的场景只想根据主键a更新部分字段b,其余的字段c保持不变,
>例如mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key update b='4';主键重复的时候只更新字段b,字段c的值不变。
>我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
>请问这种根据主键更新部分字段的场景 使用flink sql应该怎么处理?
>
>
>在 2021-08-02 10:47:55,"silence" <sl...@aliyun.com.INVALID> 写道:
>>如果只想更新部分字段的话可以试下
>>insert into t(a,b) select a,b from xxxxx
>>
>>
>>------------------------------------------------------------------
>>发件人:Ye Chen <ch...@163.com>
>>发送时间:2021年7月30日(星期五) 17:57
>>收件人:user-zh <us...@flink.apache.org>
>>主 题:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?
>>
>>现有table 
>>CREATE TABLE t (
>> a        bigint,
>> b        bigint,
>> c        bigint,
>>  PRIMARY KEY (a) NOT ENFORCED
>>) WITH (
>>...
>>);
>>
>>
>>我们的场景只想根据主键a更新部分字段b,其余的字段保持不变,例如
>>mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key update b='4';
>>主键重复的时候只更新字段b,字段c的值不变
>>
>>
>>我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
>>请问这种部分字段更新的场景 使用flink sql应该怎么处理?
>>
>>
>
>
>

回复:回复:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?

Posted by silence <sl...@aliyun.com.INVALID>.
用的什么版本这个应该已经在1.13中修复了https://issues.apache.org/jira/browse/FLINK-18726
不行的话可以在ddl中限制列的数量


------------------------------------------------------------------
发件人:Ye Chen <ch...@163.com>
发送时间:2021年8月2日(星期一) 11:37
收件人:user-zh <us...@flink.apache.org>; silence <sl...@aliyun.com>
主 题:Re:回复:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?

你好,我试了一下,如果表的ddl是三个字段,但是insert只指定两个字段的话,会报错:
[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.
我们的需求是想根据主键更新部分字段
-------------------------------------
需求:现有table 
CREATE TABLE t (
 a        bigint,
 b        bigint,
 c        bigint,
  PRIMARY KEY (a) NOT ENFORCED
) WITH (
...
);
我们的场景只想根据主键a更新部分字段b,其余的字段c保持不变,
例如mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key update b='4';主键重复的时候只更新字段b,字段c的值不变。
我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
请问这种根据主键更新部分字段的场景 使用flink sql应该怎么处理?


在 2021-08-02 10:47:55,"silence" <sl...@aliyun.com.INVALID> 写道:
>如果只想更新部分字段的话可以试下
>insert into t(a,b) select a,b from xxxxx
>
>
>------------------------------------------------------------------
>发件人:Ye Chen <ch...@163.com>
>发送时间:2021年7月30日(星期五) 17:57
>收件人:user-zh <us...@flink.apache.org>
>主 题:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?
>
>现有table 
>CREATE TABLE t (
> a        bigint,
> b        bigint,
> c        bigint,
>  PRIMARY KEY (a) NOT ENFORCED
>) WITH (
>...
>);
>
>
>我们的场景只想根据主键a更新部分字段b,其余的字段保持不变,例如
>mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key update b='4';
>主键重复的时候只更新字段b,字段c的值不变
>
>
>我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
>请问这种部分字段更新的场景 使用flink sql应该怎么处理?
>
>




Re:回复:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?

Posted by Ye Chen <ch...@163.com>.
你好,我试了一下,如果表的ddl是三个字段,但是insert只指定两个字段的话,会报错:
[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.
我们的需求是想根据主键更新部分字段

-------------------------------------

需求:现有table 
CREATE TABLE t (
 a        bigint,
 b        bigint,
 c        bigint,
  PRIMARY KEY (a) NOT ENFORCED
) WITH (
...
);
我们的场景只想根据主键a更新部分字段b,其余的字段c保持不变,
例如mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key update b='4';主键重复的时候只更新字段b,字段c的值不变。
我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
请问这种根据主键更新部分字段的场景 使用flink sql应该怎么处理?







在 2021-08-02 10:47:55,"silence" <sl...@aliyun.com.INVALID> 写道:
>如果只想更新部分字段的话可以试下
>insert into t(a,b) select a,b from xxxxx
>
>
>------------------------------------------------------------------
>发件人:Ye Chen <ch...@163.com>
>发送时间:2021年7月30日(星期五) 17:57
>收件人:user-zh <us...@flink.apache.org>
>主 题:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?
>
>现有table 
>CREATE TABLE t (
> a        bigint,
> b        bigint,
> c        bigint,
>  PRIMARY KEY (a) NOT ENFORCED
>) WITH (
>...
>);
>
>
>我们的场景只想根据主键a更新部分字段b,其余的字段保持不变,例如
>mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key update b='4';
>主键重复的时候只更新字段b,字段c的值不变
>
>
>我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
>请问这种部分字段更新的场景 使用flink sql应该怎么处理?
>
>

回复:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?

Posted by silence <sl...@aliyun.com.INVALID>.
如果只想更新部分字段的话可以试下
insert into t(a,b) select a,b from xxxxx


------------------------------------------------------------------
发件人:Ye Chen <ch...@163.com>
发送时间:2021年7月30日(星期五) 17:57
收件人:user-zh <us...@flink.apache.org>
主 题:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?

现有table 
CREATE TABLE t (
 a        bigint,
 b        bigint,
 c        bigint,
  PRIMARY KEY (a) NOT ENFORCED
) WITH (
...
);


我们的场景只想根据主键a更新部分字段b,其余的字段保持不变,例如
mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key update b='4';
主键重复的时候只更新字段b,字段c的值不变


我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
请问这种部分字段更新的场景 使用flink sql应该怎么处理?



Re:回复:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?

Posted by Ye Chen <ch...@163.com>.
你好,upsert是全字段更新,必须指定所有的字段值。我们的需求是想根据主键更新部分字段,其余字段不变。




----------------------------------------------------

现有table 
CREATE TABLE t (
 a        bigint,
 b        bigint,
 c        bigint,
  PRIMARY KEY (a) NOT ENFORCED
) WITH (
...
);
我们的场景只想根据主键a更新部分字段b,其余的字段c保持不变,例如
mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key update b='4';主键重复的时候只更新字段b,字段c的值不变。
我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
请问这种部分字段更新的场景 使用flink sql应该怎么处理?





在 2021-08-02 10:08:28,"silence" <sl...@aliyun.com.INVALID> 写道:
>你在你的sink ddl定义了主键会自动的按主键进行upsert的
>参考https://ci.apache.org/projects/flink/flink-docs-release-1.13/docs/connectors/table/jdbc/#idempotent-writes
>
>
>------------------------------------------------------------------
>发件人:Ye Chen <ch...@163.com>
>发送时间:2021年7月30日(星期五) 17:57
>收件人:user-zh <us...@flink.apache.org>
>主 题:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?
>
>现有table 
>CREATE TABLE t (
> a        bigint,
> b        bigint,
> c        bigint,
>  PRIMARY KEY (a) NOT ENFORCED
>) WITH (
>...
>);
>
>
>我们的场景只想根据主键a更新部分字段b,其余的字段保持不变,例如
>mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key update b='4';
>主键重复的时候只更新字段b,字段c的值不变
>
>
>我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
>请问这种部分字段更新的场景 使用flink sql应该怎么处理?
>
>

回复:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?

Posted by silence <sl...@aliyun.com.INVALID>.
你在你的sink ddl定义了主键会自动的按主键进行upsert的
参考https://ci.apache.org/projects/flink/flink-docs-release-1.13/docs/connectors/table/jdbc/#idempotent-writes


------------------------------------------------------------------
发件人:Ye Chen <ch...@163.com>
发送时间:2021年7月30日(星期五) 17:57
收件人:user-zh <us...@flink.apache.org>
主 题:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?

现有table 
CREATE TABLE t (
 a        bigint,
 b        bigint,
 c        bigint,
  PRIMARY KEY (a) NOT ENFORCED
) WITH (
...
);


我们的场景只想根据主键a更新部分字段b,其余的字段保持不变,例如
mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key update b='4';
主键重复的时候只更新字段b,字段c的值不变


我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
请问这种部分字段更新的场景 使用flink sql应该怎么处理?