Apache Flink的JoinFunction和CoGroupFunction有什么区别?

9
在Apache Flink中,“JoinFunction”和“CoGroupFunction”有什么区别?它们的语义和执行方式有何不同?
1个回答

26

Join 和 CoGroup 转换都是在 key 字段上连接两个输入的。它们之间的区别在于调用用户函数的方式:

  • Join 转换使用 JoinFunction 来对那些具有相同 key 字段值的来自两个输入的记录进行匹配成对。这种行为非常类似于等值内部连接。
  • CoGroup 转换使用 CoGroupFunction 来对那些具有相同 key 字段值的来自两个输入的所有记录的迭代器进行匹配。如果某个输入没有某个特定 key 值的记录,则传递一个空迭代器。除了用于内部和外部等值连接之外,CoGroup 转换还可以用于其他用途。因此,它比 Join 转换更通用。

从 Join 和 CoGroup 的执行策略来看,Join 可以使用基于排序和哈希的连接策略来执行,而 CoGroup 总是使用基于排序的策略来执行。因此,如果可能的话,连接通常比 cogroup 更有效率,应该优先使用连接。


如果我在一个窗口中有两个IN1和一个IN2,JoinFunction会被调用几次,并带有哪些参数? - fixxer
1
JoinFunction 函数对于每个笛卡尔积的一对会被调用一次。在您的情况下,对于 (IN1_1, IN2_1)(IN1_2, IN2_1),它将被调用两次。 - Fabian Hueske
如果一个窗口中有来自2个流的以下元素:[(id1, t1v1), (id1, t1v2), (id1, t1v3)]在stream1中和[(id1, t2v1), (id1, t2v2)]在stream2中。那么,对于id1,coGroup将使用Iterator[t1v1, t1v2, t1v3]和Iterator[t2v1, t2v2]进行调用,而JoinFunction将被调用6次,每个值都是上述值集合的笛卡尔积,即(t1v1, t2v1), (t1v2, t2v1), (t1v3, t2v1), (t1v1, t2v2), (t1v2, t2v2), (t1V3, t2V2)。这种理解正确吗?@FabianHueske - Gaurav Kumar
如果使用连接,如何捕获没有匹配键的元素? - Nilesh
如果您使用DataSet API,可以使用外连接。目前不确定DataStream API是否支持它们。如果不支持,你可以退而求其次使用CoGroup。 - Fabian Hueske

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接