我从以下RDD开始,代表以下数据结构,user_id,product_id,买/不是hc.parameters
要了解每位用户购买了多少产品的统计数据,我已采用以下方法:
RDD[(String, String, Int)]
问题是我在尝试这个时遇到了Java堆问题。我的总输入大小接近500GB。在独立中,我已将我的火花设置为 def userProductAggregation(rdd: org.apache.spark.rdd.RDD[(String, String, Int)]): RDD[(String, Long)] = {
val productPerUserRDD = rdd.filter(_._3 == 1)
.map { case (u, p, _) => (p, u) }
.distinct(numPartitions = 5000)
.map { case (p, _) => (p, 1L) }
.reduceByKey(_ + _, numPartitions = 5000)
return productPerUserRDD
}
。我认为这应该是很多工作。有没有更好的方法来编写这种方法?我认为我的方法非常有效,但我开始质疑这一点。我还尝试将分区数增加到--driver-cores 8G --executor-memory 16G --total-executor-cores 80
,但问题仍然存在。