2016-08-20 13 views
1

私は小売業向けの推奨システムを構築しています。私はPythonとSparkを使用します。2つの巨大なRDDのJoinまたはsubtractByKey

評価でも発生する予測のすべてのユーザープロダクトの組み合わせを除外しようとしています(以前はユーザーが購入したことのない値を予測しています)。

これら2つのRDD年代

はかなり大きく、1を使用しているとき、私はスパークsubtractByKeyのドキュメントを読んで最適であるとき、私は

filter_predictions = predictions.subtractByKey(user_boughtproduct)

を行うワーカーノードあたり28ギガバイト(3つのノード)に私のメモリの問題を与えています1つの小さいrdd。

user_boughtproductを小さくすることはできません(ループしない限り)。ただし、作成することはできます。

filter_predictions = predictions.join(user_nonBoughtProduct)

速いかのベストプラクティスであるそれらのどの任意の考え?または別のクリーナーソリューション。

答えて

2

subtractByKeyは、グループ分け後にフィルタをプッシュし、右値には触れる必要がないため、フラット化後にフィルタを外部結合するよりも若干効率的です。

エンコーダを使用してSpark 2.0+を使用すると、leftantijoinと考えることができますが、データを移動する残りのコードコストによって最適化された実行のメリットが無効になることがあります。

最後に、データ損失の可能性がある場合は、右のRDDにBloomフィルタを作成し、それを使用して左側のフィルタをフィルタリングして、シャッフルせずに本当に良い結果を得ることができます。

+0

です。別のアプローチに関するヒント – Kevin

+0

正確な結果が必要ですか? – zero323

+0

はい。 – Kevin

関連する問題