2015-06-13 14 views
7

Chcę zastosować funkcję poprzez flatMap do każdej grupy wyprodukowanej przez DataSet.groupBy. Próbuje zadzwonić flatMap pojawia się błąd kompilatora:Jak wyrównywać mapę Funkcja na GroupedDataSet w Apache Flink

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

Mój kod:

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 

Rzeczywiście, w dokumentacji flink-scala 0.9-SNAPSHOT nie map lub podobny jest na liście. Czy istnieje podobna metoda do pracy? Jak uzyskać pożądane rozproszone mapowanie dla każdej grupy osobno na węźle?

Odpowiedz

4

Możesz użyć reduceGroup(GroupReduceFunction f), aby przetworzyć wszystkie elementy grupy. A GroupReduceFunction daje Iterable dla wszystkich elementów grupy i Collector do emisji dowolnej liczby elementów.

groupBy() funkcja FLINK jest nie grupy wielu elementów w pojedynczym elemencie, to jest nie dokonuje konwersji grupę (Int, Int) elementów (czyli wszystkie mają ten sam _1 krotka Pole) w jednym (Int, Array[Int]). Zamiast tego, DataSet[(Int, Int)] jest logicznie pogrupowane w taki sposób, że wszystkie elementy, które mają ten sam klucz, mogą być przetwarzane razem. Po zastosowaniu GroupReduceFunction na GroupedDataSet funkcja będzie wywoływana raz dla każdej grupy. W każdym wywołaniu wszystkie elementy grupy są przekazywane do funkcji. Funkcja może następnie przetwarzać wszystkie elementy grupy, a także przekształcać grupę elementów (Int, Int) w pojedynczy element (Int, Array[Int]).