2

別のrddの値に基づいてrddを更新したいとします。私はこれらの3つのアプローチを試してみた: 1.使用が主で 2.使用減算に参加放置し、次いで組合 3.使用マップとそれ他のRDDの値に基づいてRDDを更新する

内部の条件に述べた3つのアプローチは非常に遅いがあれば。

例は次のとおりです。 rdd1には、別のuserIDとproductIDに基づいてrddが含まれています。たとえば、ユーザーIDが0から100の場合、製品IDは0から100までです。最初はすべてのIDが0でなければなりません。 rdd1 = [(1,1,0.0)、(1,2,0.0)、(1,3,0.0)、...、(100,100,0.0)]

次に、rdd2には特定のuserIdsとproductIds。

私が望むのは、それに対応する格付けがないにもかかわらずすべてのuserIdsとproductIdsをコラボレーティブフィルタリング用のマトリックスに含めることです。 Spark MLLibで明示的なALSを使用するには、これを行う必要があります。 0を増やすつもりでない場合、明示的なコードには観察できない値があるシナリオは含まれていないので、無意味な結果が得られます。従って、それらはゼロの代わりに欠落していると考えられる。

要するに、このrddを生成します。 rdd = [(1,1,3.0)、(1,1,0.0)、(1,2,0.0)、...、(100,100,4.0 )]

これは実行時間の点で最も速い方法ですか?私は更新に使用される数百万のエントリを持つ2つのrddを持っています。

+0

は、あなたが書いた実際のコードを共有してください。各キーにどの値を設定すべきかをどのように選択しますか? – Yaron

+0

もっと良い例がありますか?あなたはあいまいです。 –

+0

最初のrdd私は0のすべての値を持っています。私がやっているのは、0のエントリを2番目のrddに追加することです。私はrdd2の値に基づいてrdd1の値を更新する必要があります。 rdd1のキーがrdd2にある場合は、0の代わりにその値を使用する必要があります。 –

答えて

0

あなたは、単に行うことができます。

val res: RDD[(Integer, Integer)] = 
    rdd1.leftOuterJoin(rdd2) 
     .mapValues { case (v, wOpt) => wOpt.getOrElse(v) } 
+0

leftOuterJoinは、スパーク1.6の変更前のスパーク1.5.1に対して、実際には遅くなります(leftJoinの代わりにsortMergeを使用しますフィルタリング)。私がleftOuterJoinを使用しない場合、私はこれを行うことができる別のより速い方法です。私は自分のrddsのエントリの何百万を使用しています。 –

関連する問題