提问者:小点点

如何在Apache Flink中的GroupedDataSet上平面映射函数


我想通过flatMap向数据集生成的每个组应用一个函数。groupBy(分组依据)。尝试调用flatMap时,我发现编译器错误:

error: value flatMap is not a member of org.apache.flink.api.scala.GroupedDataSet

我的代码:

var mapped = env.fromCollection(Array[(Int, Int)]())
var groups = mapped.groupBy("myGroupField")
groups.flatMap( myFunction: (Int, Array[Int]) => Array[(Int, Array[(Int, Int)])] )  // error: GroupedDataSet has no member flatMap

事实上,在flink-0.9-SNAPSHOT的留档中没有列出map或类似的。是否有类似的方法可以使用?如何在节点上单独实现每个组的所需分布式映射?


共1个答案

匿名用户

您可以使用reduceGroup(GroupReduceFunction f)处理组中的所有元素。GroupReduceFunction为组中的所有元素提供了一个可伸缩的收集器,以及一个可发出任意数量元素的收集器。

Flink的groupBy()函数不会将多个元素分组为单个元素,即它不会将一组(Int, Int)元素(它们都共享相同的_1元组字段)转换为一个(Int, Array[Int])。相反,DataSet[(Int, Int)]是逻辑分组的,以便具有相同键的所有元素都可以一起处理。当您在GroupeDataSet上应用GroupRedu eFunction时,该函数将为每个组调用一次。在每次调用中,组的所有元素都一起交给该函数。然后,该函数可以处理组的所有元素,并将一组(Int, Int)元素转换为单个(Int, Array[Int])元素。