Spark Scala:GroupByKey并排序

时间:2016-04-29 15:06:50

标签: scala sorting apache-spark combiners

我有一个--private-network-ip=具有以下结构:

RDD

我的目标是val rdd = RDD[ (category: String, product: String, score: Double) ] 基于类别的数据,然后是每个类别group w.r.t.得分为sort。至于现在我的代码是:

Tuple 2 (product, score)

对于我拥有的数据来说,这是非常昂贵的操作。我希望使用替代方法来提高性能。

2 个答案:

答案 0 :(得分:3)

在不知道您的数据集的情况下难以回答,但documentation有一些线索:groupByKey效果:

  

注意:此操作可能非常昂贵。如果你正在分组   为了对每个进行聚合(例如总和或平均)   密钥,使用PairRDDFunctions.aggregateByKey或   PairRDDFunctions.reduceByKey将提供更好的性能。

所以这取决于你打算对排序列表做什么。如果您需要整个列表,那么可能很难在groupByKey上进行改进。如果您正在执行某种聚合,那么上面的替代操作(aggregateByKeyreduceByKey)可能会更好。

根据列表的大小,可能在排序之前使用替代集合(例如可变数组)更有效。

编辑:如果您的类别数量相对较少,您可以尝试重复过滤原始RDD,并对每个过滤的RDD进行排序。尽管总体上完成了相似的工作量,但在任何给定时刻都可能使用更少的内存。

编辑2 :如果内存不足是一个问题,您可以将类别和产品表示为整数ID而不是字符串,并且稍后只能查找名称。这样,您的主要RDD可能会小很多。

答案 1 :(得分:0)

您的RDD是否在类别上公平分配?根据您的偏斜因素,您可能会遇到问题。 如果您没有太多关键值,请尝试这样的事情:

val rdd: RDD[(String, String, Double)] = sc.parallelize(Seq(("someCategory","a",1.0),("someCategory","b",3.0),("someCategory2","c",4.0)))

rdd.keyBy(_._1).countByKey().foreach(println)