scala - Spark 作业一键只能得到一个结果

标签 scala apache-spark apache-spark-sql

我现在有很多键值对(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/

相关文章:

scala - 避免在 Play 中打开未使用的数据库连接

scala - 如何将csv文件转换为rdd

java - 如何在spark(java)中合并两个具有不同架构的 Parquet 文件

scala - Spark udf 初始化

sql - slick 3.1 中的多个聚合和子查询

scala - 公共(public) SBT 插件 repo 似乎被打破

java - Spark 驱动程序的 RMI 库导致 Full GC 暂停(System.gc())

matrix - Spark分布式矩阵乘法与伪逆计算

apache-spark - 尝试在 PySpark DataFrame 中创建具有最大时间戳的列

scala - 你如何调试类型级别的代码?