Apache kafka AppendStreamTableLink不';不支持使用节点连接(joinType=[InnerJoin]产生的更新更改

Apache kafka AppendStreamTableLink不';不支持使用节点连接(joinType=[InnerJoin]产生的更新更改,apache-kafka,apache-flink,flink-streaming,flink-sql,flink-batch,Apache Kafka,Apache Flink,Flink Streaming,Flink Sql,Flink Batch,当我使用Flink SQL执行以下语句时,错误报告如下: 请求 根据user\u id字段对user\u behavior\u kafka\u表中的数据进行分组,然后取出每组中ts字段值最大的数据 执行sql SELECT user_id,item_id,ts FROM user_behavior_kafka_table AS a WHERE ts = (select max(b.ts) FROM user_behavior_kafka_table AS b WHERE a.user_id

当我使用Flink SQL执行以下语句时,错误报告如下:

请求

根据
user\u id
字段对user\u behavior\u kafka\u表中的数据进行分组,然后取出每组中
ts
字段值最大的数据

执行sql

SELECT user_id,item_id,ts FROM user_behavior_kafka_table AS a 
WHERE ts = (select max(b.ts) 
FROM user_behavior_kafka_table AS b 
WHERE a.user_id = b.user_id );
弗林克版本

1.11.2

错误消息

AppendStreamTableSink doesn't support consuming update changes which is produced by node Join(joinType=[InnerJoin], where=[((user_id = user_id0) AND (ts = EXPR$0))], select=[user_id, item_id, ts, user_id0, EXPR$0], leftInputSpec=[NoUniqueKey], rightInputSpec=[JoinKeyContainsUniqueKey])

作业部署

论纱线

表格消息

AppendStreamTableSink doesn't support consuming update changes which is produced by node Join(joinType=[InnerJoin], where=[((user_id = user_id0) AND (ts = EXPR$0))], select=[user_id, item_id, ts, user_id0, EXPR$0], leftInputSpec=[NoUniqueKey], rightInputSpec=[JoinKeyContainsUniqueKey])

  • 用户行为卡夫卡表来自消费者卡夫卡主题的数据
{“用户id”:“aaa”,“项目id”:“11-222-333”,“注释”:“aaa访问项目在”,“ts”:100}

{“用户id”:“ccc”,“项目id”:“11-222-334”,“注释”:“ccc访问项目在”,“ts”:200}

{“用户id”:“ccc”,“项目id”:“11-222-333”,“注释”:“ccc访问项目在”,“ts”:300}

{“用户id”:“bbb”,“项目id”:“11-222-334”,“注释”:“bbb访问项目在”,“ts”:200}

{“用户id”:“aaa”,“项目id”:“11-222-333”,“注释”:“aaa访问项目在”,“ts”:200}

{“用户id”:“aaa”,“项目id”:“11-222-334”,“注释”:“aaa访问项目在”,“ts”:400}

{“用户id”:“ccc”,“项目id”:“11-222-333”,“注释”:“ccc访问项目在”,“ts”:400}

{“用户id”:“vvv”,“项目id”:“11-222-334”,“注释”:“vvv访问项目在”,“ts”:200}

{“用户id”:“bbb”,“项目id”:“11-222-333”,“注释”:“bbb访问项目在”,“ts”:300}

{“用户id”:“aaa”,“项目id”:“11-222-334”,“注释”:“aaa访问项目在”,“ts”:300}

{“用户id”:“ccc”,“项目id”:“11-222-333”,“注释”:“ccc访问项目在”,“ts”:100}

{“用户id”:“bbb”,“项目id”:“11-222-334”,“注释”:“bbb访问项目在”,“ts”:100}

  • 用户行为配置单元表预期结果
{“用户id”:“aaa”,“项目id”:“11-222-334”,“注释”:“aaa访问项目在”,“ts”:400}

{“用户id”:“bbb”,“项目id”:“11-222-333”,“注释”:“bbb访问项目在”,“ts”:300}

{“用户id”:“ccc”,“项目id”:“11-222-333”,“注释”:“ccc访问项目在”,“ts”:400}


{“用户id”:“vvv”,“项目id”:“11-222-334”,“注释”:“vvv访问项目在”,“ts”:200}

要从该查询中获得预期结果,需要以批处理模式执行。作为流式查询,Flink SQL planner无法处理它,如果可以,它将生成一个结果流,其中每个
用户id
的最后一个结果将与预期结果匹配,但会有额外的中间结果

例如,对于用户aaa,将显示以下结果:

aaa 11-222-333 100
aaa 11-222-333 200
aaa 11-222-334 400
但是ts=300的行将被跳过,因为它从来不是ts的最大值所在的行

如果要在流模式下执行此操作,请尝试将其重新格式化为:

从中选择用户id、项目id和ts
从(
选择*,
ROW_NUMBER()作为ROW_num
来自用户\行为\卡夫卡\表)
其中row_num=1;

我相信这应该是可行的,但我无法轻松测试它。

要从该查询中获得预期的结果,需要以批处理模式执行。作为流式查询,Flink SQL planner无法处理它,如果可以,它将生成一个结果流,其中每个
用户id
的最后一个结果将是match预期结果,但会有额外的中间结果

例如,对于用户aaa,将显示以下结果:

aaa 11-222-333 100
aaa 11-222-333 200
aaa 11-222-334 400
但是ts=300的行将被跳过,因为它从来不是ts的最大值所在的行

如果要在流模式下执行此操作,请尝试将其重新格式化为:

从中选择用户id、项目id和ts
从(
选择*,
ROW_NUMBER()作为ROW_num
来自用户\行为\卡夫卡\表)
其中row_num=1;

我相信这应该有效,但我无法轻松测试它。

非常感谢您的回复!我已经测试了您提到的解决方案,并且有效!非常感谢您的回复!我已经测试了您提到的解决方案,并且有效!