如何在Apache Flink中对GroupedDataSet上的函数进行flatMap

时间:2015-06-13 10:08:53

标签: scala hadoop apache-flink

我想通过flatMap将功能应用于DataSet.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-scala 0.9-SNAPSHOT的文档中列出了没有map或类似内容。是否有类似的方法可以使用?如何在节点上单独实现每个组的所需分布式映射?

1 个答案:

答案 0 :(得分:5)

您可以使用reduceGroup(GroupReduceFunction f)处理组中的所有元素。 GroupReduceFunction会为您提供Iterable组的所有元素和Collector以发出任意数量的元素。

Flink的groupBy()函数不会将多个元素组合到一个元素中,也就是说,它不会转换一组(Int, Int)元素(所有元素都共享_1元组字段)合为一个(Int, Array[Int])。相反,DataSet[(Int, Int)]在逻辑上被分组,以便可以一起处理具有相同密钥的所有元素。在GroupReduceFunction上应用GroupedDataSet时,将为每个组调用一次该函数。在每次调用中,组中的所有元素都被一起传递给函数。然后,该函数可以处理该组的所有元素,并将一组(Int, Int)元素转换为单个(Int, Array[Int])元素。