2016-08-20 63 views
1

我正在构建一个用于零售目的的推荐系统。我使用python和Spark。在两个巨大的RDD上加入或减去密钥

我想减去我的预测也出现在收视率(所以我只预测用户之前从未买过的产品的价值)的所有用户产品组合。

那些2名RDD的是相当大的,并给了我记忆的问题上每个工作节点28GB(3个节点),当我做

filter_predictions = predictions.subtractByKey(user_boughtproduct)

当我读到星火subtractByKey的文档是最佳使用1时大和1小rdd。

我不能使user_boughtproduct更小(除非我循环它),但我可以做出。

filter_predictions = predictions.join(user_nonBoughtProduct)

任何想法上他们是快或最佳实践的?或者另一个更清洁的解

回答

2

subtractByKey在合并后推入过滤器,并且不必触及正确的值,因此它应比使用展平后的外部联接过滤器更有效。

如果使用星火2.0+和记录可以用Dataset编码器进行编码,可以考虑leftantijoin但根据移动数据可以否定一个优化的执行的好处的代码费用的其余部分。

最后,如果您可以接受潜在的数据丢失,那么在右边的RDD上构建Bloom过滤器,并使用它过滤左边的过滤器,而不必洗牌。

+0

我明白了。有关其他方法的任何提示? – Kevin

+0

你需要确切的结果吗? – zero323

+0

优选是。 – Kevin