我现在有很多键值对(key, value)
现在对于一个键,我不想获得值的平均值或其他一些聚合,我只需要一个值。 (获取不同的键)
让我举个例子,
("1","apple")
("1","apple")
("2","orange")
("2","orange")
("1","apple")
("1","pear")
结果可以是
("2","orange")
("1","apple")
或
("2","orange")
("1","pear")
我可以使用reduceByKey(((a,b) => a))
来得到这个,但由于有很多键,时间很长。
大家有更好的建议吗?
谢谢!
最佳答案
实际上这是一个典型的类似map-reduce的问题。但是你只想每个键有一个值,所以你可以在reduce阶段完成它,尽管这不是最好的方法。现在您知道仅使用reduceByKey会在无用的shuffle中花费大量时间,这意味着您应该在Mapper中预先减少数据。所以答案对你来说是显而易见的:使用组合器。
在spark中,您可以在reduceByKey之前使用combineByKey来删除重复值。
==========
除了combiner之外,您还可以更改shuffle方法。 Spark 1.2+ 的默认随机播放是 SortShuffle。您可以将其更改为HashShuffle,这样可以减少对key进行排序的成本。
尝试在你的sparkConf中设置它
spark.shuffle.manager = hash
spark.shuffle.consolidateFiles = true
但要注意,过多的map core可能会产生过多的shuffle文件,从而影响性能。spark.shuffle.consolidateFiles
用于合并mapper输出文件。
关于scala - Spark 作业一键只能得到一个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41359947/