Apache Flink 漫谈系列 - JOIN 算子
传统数据库表的JOIN是两张静态表的数据联接,在流上面是 动态表(关于流与动态表的相关请查阅 《Apache Flink 漫谈系列 - 流表对偶(duality)性)》,双流JOIN的数据不绝流入与传统数据库表的JOIN有如下3个焦点区别:
(1) 数据Shuffle 漫衍式流计较全部数据会举办Shuffle,怎么才气保障阁下双方流的要JOIN的数据会在沟通的节点举办处理赏罚呢?在双流JOIN的场景,我们会操作JOIN中ON的联接key举办partition,确保两个流沟通的联接key会在统一个节点处理赏罚。 (2) 数据的生涯 岂论是INNER JOIN照旧OUTER JOIN 都必要对阁下双方的流的数据举办生涯,JOIN算子会开发阁下两个State举办数据存储,阁下双方的数据到来时辰,举办如下操纵:
2. 简朴场景先容实现道理 (1) INNER JOIN 实现 JOIN有许多伟大的场景,我们先以最简朴的场景举办实现道理的先容,好比:最直接的两个举办INNER JOIN,好比查询产物库存和订单数目,库存变革变乱流和订单变乱流举办INNER JOIN,JION前提是产物ID,详细如下: 双流JOIN双方变乱城市存储到State内里,如上,变乱流凭证标号先后流入到join节点,我们假设右边流较量快,先流入了3个变乱,3个变乱会存储到state中,但由于左边还没稀有据,全部右边前3个变乱流入时辰,没有join功效流出,当左边第一个变乱序号为4的流入时辰,先存储左边state,再与右边已经流入的3个变乱举办join,join的功效如图 三行功效会流入到下流节点sink。当第5号变乱流入时辰,也会和左边第4号变乱举办join,流出一条jion功效到下流节点。这里关于INNER JOIN的语义和各人夸大两点:
(2) LEFT OUTER JOIN 实现 LEFT OUTER JOIN 可以简写 LEFT JOIN,语义上和INNER JOIN的区别是岂论右流是否有JOIN的变乱,左流的变乱都必要流入下流节点,但右流没有可以JION的变乱时辰,右边的变乱补NULL。同样我们以最简朴的场景声名LEFT JOIN的实现,好比查询产物库存和订单数目,库存变革变乱流和订单变乱流举办LEFT JOIN,JION前提是产物ID,详细如下: 下图也是表达LEFT JOIN的语义,只是揭示方法差异: 上图首要存眷点是当左边先流入1,2变乱时辰,右边没有可以join的变乱时辰会向下流发送左边变乱并补NULL向下流发出,当右边第一个沟通的Join key到来的时辰会将左边先来的变乱发出的带有NULL的变乱撤回(对应上面command的-记录,+代表正向记录,-代表撤回记录)。这里夸大三点:
3. RIGHT OUTER JOIN 和 FULL OUTER JOIN RIGHT JOIN内部实现与LEFT JOIN相同, FULL JOIN和LEFT JOIN的区别是阁下双方城市发生补NULL和撤回的操纵。对付State的行使都是相似的,这里不再一再声名白。 4. 伟大场景先容State布局 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |