在Apache Flink中,“JoinFunction”和“CoGroupFunction”有什么区别?它们的语义和执行方式有何不同?
Join 和 CoGroup 转换都是在 key 字段上连接两个输入的。它们之间的区别在于调用用户函数的方式:
JoinFunction
来对那些具有相同 key 字段值的来自两个输入的记录进行匹配成对。这种行为非常类似于等值内部连接。CoGroupFunction
来对那些具有相同 key 字段值的来自两个输入的所有记录的迭代器进行匹配。如果某个输入没有某个特定 key 值的记录,则传递一个空迭代器。除了用于内部和外部等值连接之外,CoGroup 转换还可以用于其他用途。因此,它比 Join 转换更通用。从 Join 和 CoGroup 的执行策略来看,Join 可以使用基于排序和哈希的连接策略来执行,而 CoGroup 总是使用基于排序的策略来执行。因此,如果可能的话,连接通常比 cogroup 更有效率,应该优先使用连接。
JoinFunction
函数对于每个笛卡尔积的一对会被调用一次。在您的情况下,对于(IN1_1, IN2_1)
和(IN1_2, IN2_1)
,它将被调用两次。 - Fabian Hueske