0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是 Flink SQL 解决不了的问题?

京东云 来源:jf_75140285 作者:jf_75140285 2024-07-09 20:50 次阅读

简介

在实时数据开发过程中,大家经常会用 Flink SQL 或者 Flink DataStream API 来做数据加工。通常情况下选用2者都能加工出想要的数据,但是总会有 Flink SQL 覆盖不了的问题,但 SQL 的易用性又难以让人释怀。所以有些场景在使用 FLink SQL 开始就与需要额外注意,下面就介绍一种多表关联时存在部分列更新(partial Update)场景,在 DataStream API 和 Flink SQL 开发时都容易忽视的情况而导致的问题。为了简化问题描述,采用了Flink SQL 来阐述此类问题。

场景介绍

多表关联时表 A 关联表 B, 表 A 具有pk1, field1, field2, field3字段,表 B 具有 pk2, field4, field5, field6 字段,表 A 通过 pk1 关联表B pk2。使用 Flink SQL 会如下实现:

CREATE TABLE jdq_source(
pk1 INT,
field1 STIRNG,
field2 STIRNG,
field3 STIRNG,
PRIMARY KEY(pk1) NOT ENFORCED
) WITH(...);

CREATE TABLE sr_sink(
pk1 INT,
field1 STRING,
field2 STRING,
field3 STRING,
field4 STRING,
field5 STRING,
field6 STRING,
PRIMARY KEY(pk2) NOT ENFORCED
) WITH (...);

INSERT INTO C
SELECT A.pk1,A.field1,A.field2,A.field3,B.pk2,B.field4,B.field5,B.field6 FROM jdq_source A
INNER JOIN sr_sink B
ON A.pk1 = B.pk2;

上述实例中有明显特征:使用了Join 关联, 且需要注意的是写入的数据库 sink 是 StarRocks。StarRocks 存在如下特性:当表是主键表时是不支持部分列更新( Partial Update)的,实际上大部分时候大家都用的是主键表。

然后在一个SQL查询数据的接口就遇到了如下问题:每次从接口查询返回的结果都不稳定,同样的查询条件不同时机返回的结果不一样。SQL查询语句如下:

select C.field1,C.field2,C.field3
FROM C group by field1,field2,field3;
为什么SQL查询的结果会不一致呢?起初排查原因发现 group by 返回结果有多条,而在SQL 中也没有使用 order by 对数据进行排序,所以导致了结果不稳定。后又排查为什么会出现多条结果呢?于是怀疑 field1, field2, field3 有不符合预期的数据。如: 

20240530, 2, 3
20240530, 2, null
20240531, 2, 4

其中第2条是多余的,不应该出现。结果发现可能是如下原因导致的:这3个字段 filed1, field2, filed3 在StarRocks数据库中会一直在变化,不停的写入新值。导致 SQL 查询时可以查到 field3 为 null 的数据。
为什么field3为不断变化呢?究其原因是:StarRocks 主键表不支持部分列更新(Partial Update)。当field3 为null时,同样会被写入 StarRocks。我们在通过JDQ读取表A field1, field2, field3 数据给表C写入数据时,当JDQ 消息队列中表A的记录存在乱序场景且field3 字段可能为null时,最终写入StarRocks的field3 字段会出现时而为null,时而不为null。 所以SQL查询接口中 group by的结果会出现不稳定。

总结

为什么在开发的时候当时没有发现 StarRocks 主键表这个问题呢?原因:1. 大家所关注的部分列更新,多数是关注insert into table_C(field1, field2, field3) 中不包含的字段field4,field5...等被更新为null,而当前场景是会把 field3 为null的值也写入SR数据库中,这不是我们期望的结果。2.表A作为主表,通常不会出现开始field3有值后来又没有值(null)的场景。出现这个现象大概率是因为上游JDQ消息队列中的数据乱序了,导致field3 为null的后出现了。而这种问题又比较难发现。

什么情况下会出现此类问题呢?写入的数据库不支持部分列更新场景时会出现。如StarRocks, Doris。因为MySQL, ES,ClickHouse的部分表引擎支持部分列更新,所以在MySQL, ES,ClickHouse中不会出现。

同理在 DataStream API 中如果表 A,表 B 关联后的数据直接写入StarRocks 的话,也会出现此类问题。
以上这个问题在 Flink SQL 中无法解决,在 Flink DataStream API 中可以模拟部分列更新来避免此类问题。具体方法:在DatStream 任务中增加一个MapState, 用来在新数据到来时从MapState拿出缓存的数据,并和新到来的数据进行合并,来实现部分列更新功能,最后再写入 StarRocks。
虽然问题不是Flink SQL导致的,但是上面的问题可以通过Flink DataStream API来规避。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SQL
    SQL
    +关注

    关注

    1

    文章

    762

    浏览量

    44117
收藏 人收藏

    评论

    相关推荐

    AFE4490电路板读写寄存器的值一直是0x00,为什么?怎么解决?

    现在做一款关于AFE4490电路板,SPI通信问题一直解决不了,读写寄存器的值一直是0x00;我把我的SPI读写程序下载到其他开发板,读取数值一直是0xFF,该问题如何解决?应该检查什么方便问题?求指教
    发表于 12-17 07:41

    SQL错误代码及解决方案

    SQL数据库开发和管理中,常见的错误代码及其解决方案可以归纳如下: 一、语法错误(Syntax Errors) 错误代码 :无特定代码,但通常会在错误消息中明确指出是语法错误。 原因 :SQL语句
    的头像 发表于 11-19 10:21 1350次阅读

    SQL与NoSQL的区别

    在信息技术领域,数据库是存储和管理数据的核心组件。随着互联网的发展和大数据时代的到来,对数据库的需求也在不断变化。SQL和NoSQL作为两种主流的数据库管理系统,各自有着独特的优势和应用场
    的头像 发表于 11-19 10:15 157次阅读

    基于图遍历的Flink任务画布模式下零代码开发实现方案

    (DAG),并在 Flink 集群上运行。而提交一个 Flink SQL 应用,其执行流程也类似,只是多了一步使用 flink-table-planer 模块从
    的头像 发表于 11-05 10:35 660次阅读
    基于图遍历的<b class='flag-5'>Flink</b>任务画布模式下零代码开发实现方案

    TPA3123D2通过2脚控制开关机时,会出现杂音或着嗒嗒的开关机声音,怎么解决?

    ,即输入端无音乐输入或接地时.部分的板子,在SD接地,即关机情况下,还是有声音,类似收音机收不到台的沙沙声音,有的板子换个芯片可能解决,但也可能换几个都解决不了,把外围电容都换了,还是没
    发表于 10-28 08:21

    tpa3118做了一个双功放,功放出来有滋滋的底噪,怎么解决?

    我做了一个双功放,功放出来有滋滋的底噪,怎么弄都解决不了,求助大神
    发表于 10-21 08:05

    TPA3116增益不管怎么设置都最大只能输出10W,再加大输入就失真,是什么原因呢?

    有散热器,自我感觉不是过热保护,好像是过载保护) 过了好多天都解决不了,都快放弃这个芯片,请问是什么原因呢?
    发表于 10-14 08:19

    扫码配网时,LCD出现分屏是什么原因导致的?

    在扫码配网或者智能配网时,中间看串口好像是少了6,7帧画面,如图下图日志所示,应该是WIFI写flash原因导致psram进不去,时序不对了而分屏,有什么方法可以解决这个协调问题呢,看这个好像不知道为啥我也解决不了不知道是我操作问题还是什么?官方人员和大佬们也可以帮忙一下谢谢啦
    发表于 06-11 06:27

    protues出现Real Time Simulation failed to start.

    PWM波来控制)。系统想要实现的功能是基于模糊PID的温湿度控制系统设计,哪位大神帮忙看一下,兄弟是实在解决不了
    发表于 04-29 21:52

    求助贴,急急急!!!

    安装stm32cube,打开一直有问题。找人远程也解决不了说是软件bug,网络问题。
    发表于 04-18 22:06

    STM32G4的外部晶振设置can通信波特率,波特率均不正常无法通信怎么解决?

    均不正常无法通信。然后目前项目要求外设时钟必须要160M因此现在解决不了了,请问有人知道是什么原因吗,或者有什么其他解决方法
    发表于 04-11 06:23

    SQL全外连接剖析

    SQL中的全外连接是什么? 在SQL中,FULLOUTERJOIN组合左外连接和右外连接的结果,并返回连接子句两侧表中的所有(匹配或不匹配)行。接下面sojson给大家详细讲解。   图解:SQL
    的头像 发表于 03-19 18:28 2221次阅读
    <b class='flag-5'>SQL</b>全外连接剖析

    为什么需要监控SQL服务器?

    如今,大多数桌面、移动、云、物联网和其他应用程序都严重依赖数据库。为了支持这些,SQL Server部署、容量和工作负载不断增长。当这种情况发生时,企业需要确保数据系统满足所需的性能要求。 SQL
    的头像 发表于 02-19 17:19 467次阅读

    AD9914 DRG非驻留模式配置扫频连续波,SPAN打窄,噪底固定时间跳动

    吗? 配置详情:2.88GHz参考,配置中频775MHz,带宽50M,DRCTRL使用同源120M时钟产生,DAC校准在2.88G稳定后5ms左右并等待DAC校准5ms后配置其他寄存器和drctrl工作; 目前信号产生是正确的,但噪底固定时间变化一直解决不了(相位)
    发表于 01-22 00:48

    LTC3300 G3S引脚工作不正常是什么原因导致的,有什么解决办法吗?

    您好,我最近在使用LTC3300做电池模组主动均衡,但是在做的过程中发现了点问题一直解决不了。具体问题为: 一个LTC3300能够控制6节电池均衡,但是在用的时候第3、4、5节电池无法进行充电均衡
    发表于 01-05 06:00