2015-06-13 7 views
7

Desidero applicare una funzione tramite flatMap a ciascun gruppo prodotto da DataSet.groupBy. Cercando di chiamare flatMap ottengo l'errore del compilatore:Come eseguire il flatMap di una funzione su GroupedDataSet in Apache Flink

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

Il mio codice:

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 

Infatti, nella documentazione di flink-scala 0.9-SNAPSHOT non map o simili è elencato. C'è un metodo simile con cui lavorare? Come ottenere la mappatura distribuita desiderata su ciascun gruppo individualmente su un nodo?

risposta

4

È possibile utilizzare reduceGroup(GroupReduceFunction f) per elaborare tutti gli elementi di un gruppo. A GroupReduceFunction fornisce un Iterable su tutti gli elementi di un gruppo e un Collector per emettere un numero arbitrario di elementi.

funzione di Flink groupBy() non si gruppo elementi multipli in un unico elemento, cioè, non si converte un gruppo di elementi (Int, Int) (che condividono la stessa _1 campo tupla) in uno (Int, Array[Int]). Invece, un DataSet[(Int, Int)] è raggruppato logicamente in modo che tutti gli elementi che hanno la stessa chiave possano essere elaborati insieme. Quando si applica uno GroupReduceFunction su un GroupedDataSet, la funzione verrà chiamata una volta per ciascun gruppo. In ogni chiamata tutti gli elementi di un gruppo vengono assegnati alla funzione. La funzione può quindi elaborare tutti gli elementi del gruppo e anche convertire un gruppo di elementi (Int, Int) in un singolo elemento (Int, Array[Int]).

Problemi correlati