在 2 个巨大的 RDD 上加入或减去 ByKey

Join or subtractByKey on 2 huge RDD's

我正在构建一个用于零售目的的推荐系统。我使用 python 和 Spark。

我试图减去我预测的所有用户产品组合,这些组合也出现在评级中(因此我只预测用户以前从未购买过的产品的价值)。

这 2 个 RDD 非常大,当我这样做时,每个工作节点(3 个节点)28gb 的内存问题给我带来了内存问题

filter_predictions = predictions.subtractByKey(user_boughtproduct)

当我阅读 Spark 的文档时,subtractByKey 在使用 1 个大和 1 个小 rdd 时是最佳的。

我不能让 user_boughtproduct 变小(除非我循环它),但我可以。

filter_predictions = predictions.join(user_nonBoughtProduct)

有没有想过哪一个更快或最佳实践?或者其他更清洁的解决方案。

subtractByKey 在共同分组后推送过滤器并且不必触及正确的值,因此它应该比在展平后使用外部连接过滤器稍微更有效。

如果您使用 Spark 2.0+ 并且可以使用 Dataset 编码器对记录进行编码,您可以考虑 leftanti join 但是根据您的其余代码,移动数据的成本可以否定优化执行的好处。

最后,如果您可以接受潜在的数据丢失,那么在右侧的 RDD 上构建布隆过滤器并使用它来过滤左侧的 RDD 可以在不进行混洗的情况下提供非常好的结果。