日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

两条水位线的业务需求分析-Interval JOIN方案(转载+自己分析整理)

發(fā)布時間:2023/12/31 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 两条水位线的业务需求分析-Interval JOIN方案(转载+自己分析整理) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

雖然我們利用UnBounded的JOIN能解決訂單信息和付款信息join的問題,但是仔細(xì)分析用戶需求,會發(fā)現(xiàn)這個需求場景訂單信息和付款信息并不需要長期存儲,
比如2018-12-27 14:22:22的訂單只需要保持1小時,因?yàn)槌^1個小時的訂單如果沒有被付款就是無效訂單了。
同樣付款信息也不需要長期保持,2018-12-27 14:22:22的訂單付款信息如果是2018-12-27 15:22:22以后到達(dá)的那么我們也沒有必要保存到State中。?
而對于UnBounded的雙流JOIN我們會一直將數(shù)據(jù)保存到State中,如下示意圖:

這樣的底層實(shí)現(xiàn),對于當(dāng)前需求有不必要的性能損失。所以我們有必要開發(fā)一種新的可以清除State的JOIN方式(Interval JOIN)來高性能的完成上面的查詢需求。

什么是Interval JOIN

Interval JOIN 相對于UnBounded的雙流JOIN來說是Bounded JOIN。就是每條流的每一條數(shù)據(jù)會與另一條流上的不同時間區(qū)域的數(shù)據(jù)進(jìn)行JOIN。對應(yīng)Apache Flink官方文檔的 Time-windowed JOIN(release-1.7之前都叫Time-Windowed JOIN)。

?

Interval JOIN 語義

Interval JOIN 的語義就是每條數(shù)據(jù)對應(yīng)一個 Interval 的數(shù)據(jù)區(qū)間,比如有一個訂單表Orders(orderId, productName, orderTime)和付款表Payment(orderId, payType, payTime)。 假設(shè)我們要統(tǒng)計(jì)在下單一小時內(nèi)付款的訂單信息。SQL查詢?nèi)缦?

SELECT o.orderId,o.productName,p.payType,o.orderTime,cast(payTime as timestamp) as payTime FROMOrders AS o JOIN Payment AS p ON o.orderId = p.orderId AND p.payTime BETWEEN orderTime AND orderTime + INTERVAL '1' HOUR

?

選擇數(shù)據(jù)的要求是:

支付時間在下單時間一小時以內(nèi)(同時要求orderId相等)

------------------下面是具體舉例----------------------------------------

  • Orders訂單數(shù)據(jù)
orderIdproductNameorderTime
001iphone2018-12-26 04:53:22.0
002mac2018-12-26 04:53:23.0
003book2018-12-26 04:53:24.0
004cup2018-12-26 04:53:38.0
  • Payment付款數(shù)據(jù)
orderIdpayTypepayTime
001alipay2018-12-26 05:51:41.0
002card2018-12-26 05:53:22.0
003card2018-12-26 05:53:30.0
004alipay2018-12-26 05:53:31.0

符合語義的預(yù)期結(jié)果是 訂單id為003的信息不出現(xiàn)在結(jié)果表中,因?yàn)橄聠螘r間2018-12-26 04:53:24.0, 付款時間是?2018-12-26 05:53:30.0超過了1小時付款。

所以上面兩個表格中紅色數(shù)據(jù)表示下單后沒有被及時支付,訂單被取消。

?

所以有效訂單的預(yù)期結(jié)果如下 :

orderIdproductNamepayTypeorderTimepayTime
001iphonealipay2018-12-26 04:53:22.02018-12-26 05:51:41.0
002maccard2018-12-26 04:53:23.02018-12-26 05:53:22.0
004cupalipay2018-12-26 04:53:38.02018-12-26 05:53:31.0

?

完整代碼是(flink1.11.2 Java版本,來自[2]中的修改為java版本):

https://gitee.com/appleyuchi/Flink_Code/blob/master/table_api/Java/src/main/java/SimpleTimeIntervalJoin.java

代碼運(yùn)行結(jié)果如下:

001,iphone,alipay,2018-12-26T04:53:22,2018-12-26T05:51:41
002,mac,card,2018-12-26T04:53:23,2018-12-26T05:53:22
004,cup,alipay,2018-12-26T04:53:38,2018-12-26T05:53:31

?

Reference:

[1]Flink-1.9流計(jì)算開發(fā):十六、intervalJoin函數(shù)

[2]Apache Flink 漫談系列(12) - Time Interval(Time-windowed) JOIN

?

?

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的两条水位线的业务需求分析-Interval JOIN方案(转载+自己分析整理)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。