Flink:如何在一次转换中处理和输出两个数据集?
Flink : How to process and output two datasets in a single transformation?
join 和 coGroup 转换可以读取 2 个输入数据集并输出一个 ("Y" flux)(如果我错了请纠正我)。
我想处理和更新 2 个数据集。为此,我计划使用 2 coGroup
个转换。
但是,出于性能目的,这两个转换是否可以在一个转换中完成 ("H" flux)?
此外,随着数据集的更新,我想对它们进行迭代。如果目前做不到,以后会支持这种改造吗?
所有Flink DataSet算子都只支持单输出,但一个算子的输出可以被后面两个或多个算子消费。
有两种方法可以解决您的问题:
- 使用单个 CoGroup 计算两个输出的结果,并添加两个 Filter 以过滤掉两个输出之一的记录。如果两个输出具有不同的数据类型,您需要计算 return 类似
Tuple2<FirstType, SecondType>
的东西。这个解决方案看起来像:
input1--\ /--> Filter_output1
CoGroup
input2--/ \--> Filter_output2
- 根据分组键对两个 CoGroup 输入进行分区和排序,并调用两个单独的 CoGroup。每个 CoGroup 计算一个输出。通过在 CoGroup 之前对数据进行排序,可以重复使用分区和排序。重要的是,所有运算符必须使用相同的并行度!
input1 --> PartitionHash --> SortPartition -\-/-> CoGroup1 --> Output1
X
input2 --> PartitionHash --> SortPartition -/-\-> CoGroup2 --> Output2
关于迭代,看看Flink的iteration operators。
join 和 coGroup 转换可以读取 2 个输入数据集并输出一个 ("Y" flux)(如果我错了请纠正我)。
我想处理和更新 2 个数据集。为此,我计划使用 2 coGroup
个转换。
但是,出于性能目的,这两个转换是否可以在一个转换中完成 ("H" flux)?
此外,随着数据集的更新,我想对它们进行迭代。如果目前做不到,以后会支持这种改造吗?
所有Flink DataSet算子都只支持单输出,但一个算子的输出可以被后面两个或多个算子消费。
有两种方法可以解决您的问题:
- 使用单个 CoGroup 计算两个输出的结果,并添加两个 Filter 以过滤掉两个输出之一的记录。如果两个输出具有不同的数据类型,您需要计算 return 类似
Tuple2<FirstType, SecondType>
的东西。这个解决方案看起来像:
input1--\ /--> Filter_output1 CoGroup input2--/ \--> Filter_output2
- 根据分组键对两个 CoGroup 输入进行分区和排序,并调用两个单独的 CoGroup。每个 CoGroup 计算一个输出。通过在 CoGroup 之前对数据进行排序,可以重复使用分区和排序。重要的是,所有运算符必须使用相同的并行度!
input1 --> PartitionHash --> SortPartition -\-/-> CoGroup1 --> Output1 X input2 --> PartitionHash --> SortPartition -/-\-> CoGroup2 --> Output2
关于迭代,看看Flink的iteration operators。