2015-06-13 5 views
7

flatMap aracılığıyla bir işlevi DataSet.groupBy tarafından üretilen her gruba uygulamak istiyorum. flatMap Ben derleyici hatası alıyorum aramaya çalışıyorum:Nasıl Yapılır Apache Flink'te GroupedDataSet'te bir işlev oluşturma

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

Kodum:

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 

Nitekim flink-scala 0.9-SNAPSHOT hiçbir map veya benzeri belgelerinde listelenir. Çalışmak için benzer bir yöntem var mı? Her bir grup üzerinde istenen dağıtılmış eşleştirmeyi bir düğümde ayrı ayrı nasıl elde edilir?

cevap

4

Bir grubun tüm öğelerini işlemek için reduceGroup(GroupReduceFunction f) kullanabilirsiniz. Bir GroupReduceFunction, bir grubun tüm öğeleri üzerinde Iterable ve rasgele sayıdaki bir öğeyi yaymak için Collector verir.

FLINK en groupBy() işlevi tek bir eleman, yani, içine grup çoklu elemanlar, bu elemanların (Int, Int) bir grup dönüştürmez değildir (diğer bir deyişle hepsi aynı _1 tuple alanı) bir (Int, Array[Int]) içine. Bunun yerine, DataSet[(Int, Int)] mantıksal olarak, aynı anahtara sahip tüm öğelerin birlikte işlenebileceği şekilde gruplandırılır. Bir üzerinde bir GroupReduceFunction uygulandığında, işlev her grup için bir kez çağrılır. Her çağrıda, bir grubun tüm elemanları işleve birlikte teslim edilir. İşlev daha sonra grubun tüm öğelerini işleyebilir ve aynı zamanda (Int, Int) öğesinin bir grubunu tek bir (Int, Array[Int]) öğesine dönüştürebilir.