Apache flink 阿帕奇·弗林克如何';joins函数和cogroup函数不同?

Apache flink 阿帕奇·弗林克如何';joins函数和cogroup函数不同?,apache-flink,Apache Flink,ApacheFlink中的JoinFunction和CoGroupFunction有什么区别?语义和执行有何不同?连接和协同组转换都将关键字段上的两个输入连接起来。区别在于如何调用用户函数: Join转换调用JoinFunction,其中包含来自两个输入的成对匹配记录,这两个输入的键字段值相同。此行为非常类似于相等内部联接 CoGroup转换使用迭代器调用CoGroup函数,迭代器覆盖两个输入的所有记录,这两个输入的关键字段值相同。如果输入没有某个键值的记录,则传递一个空迭代器。除其他外,可以

ApacheFlink中的
JoinFunction
CoGroupFunction
有什么区别?语义和执行有何不同?

连接和协同组转换都将关键字段上的两个输入连接起来。区别在于如何调用用户函数:

  • Join转换调用
    JoinFunction
    ,其中包含来自两个输入的成对匹配记录,这两个输入的键字段值相同。此行为非常类似于相等内部联接
  • CoGroup转换使用迭代器调用
    CoGroup函数
    ,迭代器覆盖两个输入的所有记录,这两个输入的关键字段值相同。如果输入没有某个键值的记录,则传递一个空迭代器。除其他外,可以使用CoGroup变换进行内部和外部相等联接。因此,它比连接转换更通用

查看Join和CoGroup的执行策略,可以使用基于排序和哈希的连接策略执行Join,而as CoGroup始终使用基于排序的策略执行。因此,连接通常比cogroup更有效,如果可能的话,应该首选连接。

如果在一个窗口中有两个IN1和一个IN2,将调用多少次JoinFunction以及使用哪些参数?对于每对叉积,将调用一次
JoinFunction
。在您的例子中,如果一个窗口中有来自2个流的以下元素,则
(IN1\u 1,IN2\u 1)
(IN1\u 2,IN2\u 1)
是两次。流1中的[(id1,t1v1),(id1,t1v2),(id1,t1v3)]和流2中的[(id1,t2v1),(id1,t2v2)]。然后将使用迭代器[t1v1,t1v2,t1v3]和迭代器[t2v1,t2v2]对id1调用coGroup,而JoinFunction将使用上述一组值的笛卡尔乘积中的每个值调用6次,即(t1v1,t2v1),(t1v2,t2v1),(t1v3,t2v1),(t1v1,t2v2),(t1v3,t2v2)。这种理解正确吗@FabianHueskeIf使用联接,如何在没有任何匹配键的情况下捕获元素?如果使用DataSet API,则可以使用外部联接。不确定DataStream API是否支持它们。否则,您可以退回到CoGroup。