两条水位线的业务需求分析-Interval JOIN方案(转载+自己分析整理)
雖然我們利用UnBounded的JOIN能解決訂單信息和付款信息join的問題,但是仔細分析用戶需求,會發現這個需求場景訂單信息和付款信息并不需要長期存儲,
比如2018-12-27 14:22:22的訂單只需要保持1小時,因為超過1個小時的訂單如果沒有被付款就是無效訂單了。
同樣付款信息也不需要長期保持,2018-12-27 14:22:22的訂單付款信息如果是2018-12-27 15:22:22以后到達的那么我們也沒有必要保存到State中。?
而對于UnBounded的雙流JOIN我們會一直將數據保存到State中,如下示意圖:
這樣的底層實現,對于當前需求有不必要的性能損失。所以我們有必要開發一種新的可以清除State的JOIN方式(Interval JOIN)來高性能的完成上面的查詢需求。
什么是Interval JOIN
Interval JOIN 相對于UnBounded的雙流JOIN來說是Bounded JOIN。就是每條流的每一條數據會與另一條流上的不同時間區域的數據進行JOIN。對應Apache Flink官方文檔的 Time-windowed JOIN(release-1.7之前都叫Time-Windowed JOIN)。
?
Interval JOIN 語義
Interval JOIN 的語義就是每條數據對應一個 Interval 的數據區間,比如有一個訂單表Orders(orderId, productName, orderTime)和付款表Payment(orderId, payType, payTime)。 假設我們要統計在下單一小時內付款的訂單信息。SQL查詢如下:
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?
選擇數據的要求是:
支付時間在下單時間一小時以內(同時要求orderId相等)
------------------下面是具體舉例----------------------------------------
- Orders訂單數據
| 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付款數據
| 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 |
符合語義的預期結果是 訂單id為003的信息不出現在結果表中,因為下單時間2018-12-26 04:53:24.0, 付款時間是?2018-12-26 05:53:30.0超過了1小時付款。
所以上面兩個表格中紅色數據表示下單后沒有被及時支付,訂單被取消。
?
所以有效訂單的預期結果如下 :
| 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
代碼運行結果如下:
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流計算開發:十六、intervalJoin函數
[2]Apache Flink 漫談系列(12) - Time Interval(Time-windowed) JOIN
?
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的两条水位线的业务需求分析-Interval JOIN方案(转载+自己分析整理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 运满满司机怎么取消接的单子
- 下一篇: 拼多多商家开店流程