两条水位线的业务需求分析-Interval JOIN方案(转载+自己分析整理)
雖然我們利用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ù)
| 001 | iphone | 2018-12-26 04:53:22.0 |
| 002 | mac | 2018-12-26 04:53:23.0 |
| 003 | book | 2018-12-26 04:53:24.0 |
| 004 | cup | 2018-12-26 04:53:38.0 |
- Payment付款數(shù)據(jù)
| 001 | alipay | 2018-12-26 05:51:41.0 |
| 002 | card | 2018-12-26 05:53:22.0 |
| 003 | card | 2018-12-26 05:53:30.0 |
| 004 | alipay | 2018-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é)果如下 :
| 001 | iphone | alipay | 2018-12-26 04:53:22.0 | 2018-12-26 05:51:41.0 |
| 002 | mac | card | 2018-12-26 04:53:23.0 | 2018-12-26 05:53:22.0 |
| 004 | cup | alipay | 2018-12-26 04:53:38.0 | 2018-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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 运满满司机怎么取消接的单子
- 下一篇: 拼多多商家开店流程