2016-08-20 28 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