本文為《Flink大數據項目實戰》學習筆記,想通過視頻系統學習Flink這個最火爆的大數據計算框架的同學,推薦學習課程:
Flink大數據項目實戰:http://t.cn/EJtKhaz
1. Window CoGroup與Join
1.1回顧RDBMS各種join
假設有兩個表A和B
1.CROSS JOIN(AB的笛卡爾積/交叉聯接)
省略寫法為join,由於其返回的結果為被連接的兩個數據表的乘積,因此當有WHERE, ON或USING條件的時候一般不建議使用,因為當數據表項目太多的時候,會非常慢。
2.outer join
a)left join(左聯接) 返回包括左表中的所有記錄和右表中聯結字段相等的記錄。
b)right join(右聯接) 返回包括右表中的所有記錄和左表中聯結字段相等的記錄。
c)FULL JOIN 產生A和B的並集。對於沒有匹配的記錄,則會以null做為值。
3.inner join(AB的交集)--默認就是這種join,又叫等值連接
inner join(等值連接) 只返回兩個表中聯結字段相等的行。
1.2Flink中CoGroup vs Join Connect
1.3CoGroup
1.4Join
上圖可以做如下理解:
1、雙流上的數據在同一個key的會被分別分配到同一個window窗口的左右兩個籃子里
2、當window結束的時候,會對左右籃子進行笛卡爾積從而得到每一對pair,對每一對pair應用 JoinFunction
3、因為目前join窗口的雙流數據都是被緩存在內存中的,如果某個key對應的數據太多導致jvm OOM(數據傾斜是常態)-這也算是目前社區的優化優化方向
4、有局限性,受制於時間窗口
1.5Tumbling Window Join
1.6Tumbling Window Join
1.7Sliding Window Join
1.8Session Window Join
2. Interval Join
KeyedStream,KeyedStream → DataStream
在給定的時間邊界內(默認包含邊界),相當於一個窗口,按照指定的key對兩個KeyedStream進行join操作,把符合join條件的兩個event拉到一起,然后怎么處理由用戶你來定義。
key1 == key2 && e1.timestamp + lowerBound <= e2.timestamp <= e1.timestamp + upperBound
場景:把一定時間范圍內相關的分組數據拉成一個寬表