成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Flink SQL 知其所以然之去重不僅僅有 Count Distinct 還有強大的 Deduplication

運維 數據庫運維
熟悉離線計算的小伙伴可能很快就能給出答案。沒錯,hive sql 中的 row_number = 1。flink sql 中也是提供了一模一樣的功能,xdm,完美的解決這個問題。

[[436600]]

1.序篇

源碼公眾號后臺回復1.13.2 deduplication 的奇妙解析之路獲取。

下面即是文章目錄,也對應到了本文的結論,小伙伴可以先看結論快速了解博主期望本文能給小伙伴們帶來什么幫助:

  • 背景及應用場景介紹:博主期望你了解到,flink sql 的 deduplication 其實就是 row_number = 1,所以它可以在去重的同時,還能保留原始字段數據
  • 來一個實戰案例:博主以一個日志上報重復的場景,來引出下文要介紹的 flink sql deduplication 解決方案
  • 基于 Deduplication 的解決方案及原理解析:博主期望你了解到,deduplication 中,當 row_number order by proctime(處理時間)去重的原理就是給每一個 partition key 維護一個 value state。如果當前 value state 不為空,則說明 id 已經來過了,當前這條數據就不用下發了。如果 value state 為空,則 id 還沒還沒來過,把 value state 標記之后,把當前數據下發。
  • 總結及展望篇

2.背景及應用場景介紹

你是否遇到過一下的場景:

由于上游發過來的數據有重復或者日志源頭數據有重復上報,導致下游計算 count,sum 時算多

想做到去重計算的同時,原始表的所有字段還能正常保留且下發

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

熟悉離線計算的小伙伴可能很快就能給出答案。沒錯,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 應該怎么寫:

  1. select id, 
  2.        timestamp
  3.        page, 
  4.        param1, 
  5.        param2, 
  6.        paramN 
  7. from ( 
  8.       SELECT 
  9.           id, 
  10.           timestamp
  11.           page, 
  12.           param1, 
  13.           param2, 
  14.           paramN 
  15.           -- proctime 代表處理時間即 source 表中的 PROCTIME() 
  16.           row_number() over(partition by id order by proctime) as rn 
  17.       FROM source_table 
  18. where rn = 1 

上面的 sql 應該很好理解。其中由于我們并不關心重復數據上報的時間前后,所以此處就直接使用 order by proctime 進行處理,按照數據來的前后時間去第一條。

4.2.proctime 下 flink 生成的算子圖及 sql 算子語義

算子圖如下所示:

deduplication

  • source 算子:source 通過 keyby 的方式向 deduplication 算子發數據時,其中 keyby 的 key 就是 sql 中的 id
  • 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.ProcTimeDeduplicateKeepFirstRowFunction 的 processFirstRowOnProcTime,如下圖所示:

ProcTimeDeduplicateKeepFirstRowFunction

5.總結與展望

源碼公眾號后臺回復1.13.2 deduplication 的奇妙解析之路獲取。

本文主要介紹了 deduplication 的應用場景案例以及其運行原理,主要包含下面兩部分:

背景及應用場景介紹:博主期望你了解到,flink sql 的 deduplication 其實就是 row_number = 1,所以它可以在去重的同時,還能保留原始字段數據

來一個實戰案例:博主以一個日志上報重復的場景,來引出下文要介紹的 flink sql deduplication 解決方案

基于 Deduplication 的解決方案及原理解析:博主期望你了解到,deduplication 中,當 row_number order by proctime(處理時間)去重的原理就是給每一個 partition key 維護一個 value state。如果當前 value state 不為空,則說明 id 已經來過了,當前這條數據就不用下發了。如果 value state 為空,則 id 還沒還沒來過,把 value state 標記之后,把當前數據下發。 

 

責任編輯:武曉燕 來源: 大數據羊說
相關推薦

2022-07-12 09:02:18

Flink SQL去重

2022-05-22 10:02:32

CREATESQL 查詢SQL DDL

2022-05-18 09:02:28

Flink SQLSQL字符串

2021-12-09 06:59:24

FlinkSQL 開發

2022-05-15 09:57:59

Flink SQL時間語義

2022-07-05 09:03:05

Flink SQLTopN

2022-06-10 09:01:04

OverFlinkSQL

2022-06-06 09:27:23

FlinkSQLGroup

2022-06-29 09:01:38

FlinkSQL時間屬性

2022-05-27 09:02:58

SQLHive語義

2022-05-12 09:02:47

Flink SQL數據類型

2021-11-28 11:36:08

SQL Flink Join

2022-08-10 10:05:29

FlinkSQL

2021-11-27 09:03:26

flink join數倉

2021-09-12 07:01:07

Flink SQL ETL datastream

2021-12-06 07:15:47

開發Flink SQL

2021-12-17 07:54:16

Flink SQLTable DataStream

2022-05-09 09:03:04

SQL數據流數據

2022-06-18 09:26:00

Flink SQLJoin 操作

2011-12-06 08:44:01

程序員
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产男女猛烈无遮掩视频免费网站 | 久久精品国产一区二区电影 | 国产精品揄拍一区二区 | 羞羞视频在线观免费观看 | 日韩一二区在线 | 亚洲欧洲日韩 | 国产一区二区中文字幕 | 亚洲一区在线免费观看 | 欧美成人a | 日韩视频一区二区 | 免费看国产一级特黄aaaa大片 | 日韩在线免费 | 综合精品久久久 | 日韩精品中文字幕一区二区三区 | 中文字幕免费视频 | 99久久夜色精品国产亚洲96 | 日本午夜精品一区二区三区 | 免费观看的av毛片的网站 | 欧美日韩高清一区 | 国产精品欧美精品 | 午夜爽爽爽男女免费观看影院 | 欧美精品在线观看 | 久久国产精品免费一区二区三区 | 国产精品久久久 | 国产精品99| 国产成人精品一区二区三区在线 | 亚洲精品视频网站在线观看 | 亚洲精品视频在线播放 | 成人欧美一区二区 | 久久九九影视 | 国产精品美女久久久久久免费 | 国产精品大片 | 九九久久久 | 日韩精品一区二区三区中文在线 | 不卡一区| 欧美一级片在线看 | 成人精品毛片 | 久久久久久免费观看 | 久久一区精品 | 911精品国产 | 成人在线精品视频 |