私はRDDに加えてDataFramesとDataSetsの使用方法を学びたいと考えています。 RDDの場合、私はsomeRDD.reduceByKey((x,y) => x + y)
を行うことができますが、私はデータセットのためのその機能は表示されません。だから私は1つ書くことにしました。Spark Datasetで独自のreduceByKeyをローリング
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
})
ただし、ドライバにすべてが返されます。 Dataset
を返すにはどうすればいいですか?たぶんmapPartitionそれを行うか?それはMap
まだ
、Spark 2.0.0を試してみてください、あなたのデータセット.groupByKey(...)。reduceGroups(...) –
触媒オプティマイザは、グループに続いて還元を行い、 「効率的」というのは、RDDでキーを減らしていくことが、グループを減らしていくよりも優れているということです。 –