我想通过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
或类似的。是否有类似的方法可以使用?如何在节点上单独实现每个组的所需分布式映射?
您可以使用reduceGroup(GroupReduceFunction f)处理组中的所有元素。GroupReduceFunction为组中的所有元素提供了一个可伸缩的收集器,以及一个可发出任意数量元素的收集器。
Flink的groupBy()
函数不会将多个元素分组为单个元素,即它不会将一组(Int, Int)
元素(它们都共享相同的_1
元组字段)转换为一个(Int, Array[Int])
。相反,DataSet[(Int, Int)]
是逻辑分组的,以便具有相同键的所有元素都可以一起处理。当您在GroupeDataSet
上应用GroupRedu eFunction
时,该函数将为每个组调用一次。在每次调用中,组的所有元素都一起交给该函数。然后,该函数可以处理组的所有元素,并将一组(Int, Int)
元素转换为单个(Int, Array[Int])
元素。