我有一个--private-network-ip=
具有以下结构:
RDD
我的目标是val rdd = RDD[ (category: String, product: String, score: Double) ]
基于类别的数据,然后是每个类别group
w.r.t.得分为sort
。至于现在我的代码是:
Tuple 2 (product, score)
对于我拥有的数据来说,这是非常昂贵的操作。我希望使用替代方法来提高性能。
答案 0 :(得分:3)
在不知道您的数据集的情况下难以回答,但documentation有一些线索:groupByKey
效果:
注意:此操作可能非常昂贵。如果你正在分组 为了对每个进行聚合(例如总和或平均) 密钥,使用PairRDDFunctions.aggregateByKey或 PairRDDFunctions.reduceByKey将提供更好的性能。
所以这取决于你打算对排序列表做什么。如果您需要整个列表,那么可能很难在groupByKey
上进行改进。如果您正在执行某种聚合,那么上面的替代操作(aggregateByKey
,reduceByKey
)可能会更好。
根据列表的大小,可能在排序之前使用替代集合(例如可变数组)更有效。
编辑:如果您的类别数量相对较少,您可以尝试重复过滤原始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)