在 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 可以在不进行混洗的情况下提供非常好的结果。
我正在构建一个用于零售目的的推荐系统。我使用 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 可以在不进行混洗的情况下提供非常好的结果。