Próbuję nauczyć się używać DataFrames i DataSet więcej oprócz RDD. W przypadku RDD wiem, że mogę wykonać someRDD.reduceByKey((x,y) => x + y)
, ale nie widzę tej funkcji dla zestawu danych. Więc postanowiłem napisać jedną.Trasowanie własnego reduByKey w Spark Dataset
someRdd.map(x => ((x.fromId,x.toId),1)).map(x => collection.mutable.Map(x)).reduce((x,y) => {
val result = mutable.HashMap.empty[(Long,Long),Int]
val keys = mutable.HashSet.empty[(Long,Long)]
y.keys.foreach(z => keys += z)
x.keys.foreach(z => keys += z)
for (elem <- keys) {
val s1 = if(x.contains(elem)) x(elem) else 0
val s2 = if(y.contains(elem)) y(elem) else 0
result(elem) = s1 + s2
}
result
})
Powoduje to jednak zwrócenie wszystkiego do sterownika. Jak napisałbyś to, aby zwrócić Dataset
? Może map Partition i zrobić to tam?
Uwaga to kompiluje, ale nie działa, ponieważ nie ma dla koderów Map
jeszcze
ze Spark 2.0.0, spróbuj tego, yourDataset.groupByKey (...). ReduceGroups (...) –
Czy optymalizator katalizatora zauważy, że robisz grupę, a następnie redukuje i zwiększa wydajność? Przez "skuteczny" mam na myśli, w jaki sposób na RDD robi redukcję przez klucz jest lepszy niż robienie grupy przez to zmniejszyć przez? –