flink sql 知其所以然(十一):去重不仅仅有 count distinct 还有强大的 deduplication

1.序篇

下面即是文章目录,也对应到了本文的结论,小伙伴可以先看结论快速了解博主期望本文能给小伙伴们带来什么帮助:

  1. 背景及应用场景介绍:博主期望你了解到,flink sql 的 deduplication 其实就是 row_number = 1,所以它可以在去重的同时,还能保留原始字段数据
  2. 来一个实战案例:博主以一个日志上报重复的场景,来引出下文要介绍的 flink sql deduplication 解决方案
  3. 基于 Deduplication 的解决方案及原理解析:博主期望你了解到,deduplication 中,当 row_number order by proctime(处理时间)去重的原理就是给每一个 partition key 维护一个 value state。如果当前 value state 不为空,则说明 id 已经来过了,当前这条数据就不用下发了。如果 value state 为空,则 id 还没还没来过,把 value state 标记之后,把当前数据下发。
  4. 总结及展望篇

2.背景及应用场景介绍

你是否遇到过一下的场景:

  1. 由于上游发过来的数据有重复或者日志源头数据有重复上报,导致下游计算 count,sum 时算多
  2. 想做到去重计算的同时,原始表的所有字段还能正常保留且下发

那么你能想到哪些解决方案呢?

熟悉离线计算的小伙伴可能很快就能给出答案。没错,hive sql 中的 row_number = 1。flink sql 中也是提供了一模一样的功能,xdm,完美的解决这个问题。

下面开始正式篇章。

3.来一个实战案例

先来一个实际案例来看看在具体输入值的场景下,输出值应该长啥样。

场景:埋点数据上报的的字段有 id(标识唯一一条日志),timestamp(事件时间戳),page(时间发生的当前页面),param1,param2,paramN...。但是日志上报时由于一些机制导致日志上报重复,下游算多了,因此需要做一次去重,下游再去消费去过重的数据。

来一波输入数据:

id timestamp page param1 param2 paramN
1 2021-11-01 00:01:00 A xxx1 xxx2 xxxN
1 2021-11-01 00:01:00 A xxx1 xxx2 xxxN
2 2021-11-01 00:01:00 A xxx3 xxx2 xxxN
2 2021-11-01 00:01:00 A xxx3 xxx2 xxxN
3 2021-11-01 00:03:00 C xxx5 xxx2 xxxN

其中第二条和第四条是重复上报的数据,则预期输出数据如下:

id timestamp page param1 param2 paramN
1 2021-11-01 00:01:00 A xxx1 xxx2 xxxN
2 2021-11-01 00:01:00 A xxx3 xxx2 xxxN
3 2021-11-01 00:03:00 C xxx5 xxx2 xxxN

4.基于 Deduplication 的解决方案及原理解析

4.1.sql 写法

还是上面的案例,我们来看看最终的 sql 应该怎么写:

select id, timestamp, page, param1, param2, paramN from ( SELECT id, timestamp, page, param1, param2, paramN -- proctime 代表处理时间即 source 表中的 PROCTIME() row_number() over(partition by id order by proctime) as rn FROM source_table ) where rn = 1

上面的 sql 应该很好理解。其中由于我们并不关心重复数据上报的时间前后,所以此处就直接使用 order by proctime 进行处理,按照数据来的前后时间去第一条。

4.2.proctime 下 flink 生成的算子图及 sql 算子语义

算子图如下所示:

图片

deduplication

  1. source 算子:source 通过 keyby 的方式向 deduplication 算子发数据时,其中 keyby 的 key 就是 sql 中的 id
  2. deduplication 算子:deduplication 算子为每一个 partition key 都维护了一个 value state 用于去重。每来一条数据时都从当前 partition key 的 value state 去获取 value, 如果不为空,则说明已经有数据来过了,当前这一条数据就是重复数据,就不往下游算子下发了, 如果为空,则说明之前没有数据来过,当前这一条数据就是第一条数据,则把当前的 value state 值设置为 true,往下游算子下发数据

4.3.proctime 下 deduplication 原理解析

具体的去重算子为 deduplication。我们通过 transformation 可以看到去重算子为下图所示:

图片

transformation

上述的去重逻辑集中在 org.apache.flink.table.runtime.operators.deduplicate.ProcTimeDeduplicateKeepFirstRowFunctionprocessFirstRowOnProcTime,如下图所示:

图片

ProcTimeDeduplicateKeepFirstRowFunction

5.总结与展望

本文主要介绍了 deduplication 的应用场景案例以及其运行原理,主要包含下面两部分:

  1. 背景及应用场景介绍:博主期望你了解到,flink sql 的 deduplication 其实就是 row_number = 1,所以它可以在去重的同时,还能保留原始字段数据
  2. 来一个实战案例:博主以一个日志上报重复的场景,来引出下文要介绍的 flink sql deduplication 解决方案
  3. 基于 Deduplication 的解决方案及原理解析:博主期望你了解到,deduplication 中,当 row_number order by proctime(处理时间)去重的原理就是给每一个 partition key 维护一个 value state。如果当前 value state 不为空,则说明 id 已经来过了,当前这条数据就不用下发了。如果 value state 为空,则 id 还没还没来过,把 value state 标记之后,把当前数据下发。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容