我正在建立一个零售目的的推荐系统。我使用python和Spark。
我试图减去我的预测的所有用户产品组合,这些组合也会出现在评级中(因此我只预测用户以前从未购买过的产品的价值)。
这两个RDD非常大,当我这样做时,每个工作节点(3个节点)的28gb给我内存问题
filter_predictions = predictions.subtractByKey(user_boughtproduct)
当我阅读Spark的文档时,使用1个大的和1个小的rdd时,subtractByKey是最佳的。
我不能让user_boughtproduct更小(除非我循环它),但我可以做。
filter_predictions = predictions.join(user_nonBoughtProduct)
有关哪一项更快或最佳做法的想法?或者另一种清洁解决方案。
答案 0 :(得分:2)
subtractByKey
在共同分组后推送过滤器,并且不必触摸正确的值,因此它应该比展平后使用外部连接过滤器更有效。
如果您使用Spark 2.0+并且可以使用Dataset
编码器对记录进行编码,则可以考虑leftanti
join
,但根据您的代码的其余部分,移动数据的成本可能会抵消优化执行。
最后,如果您可以接受潜在的数据丢失,那么在右侧RDD上构建Bloom过滤器并使用它来过滤左侧的过滤器可以在不进行改组的情况下提供非常好的结果。