2017-08-05 2 views
2

すべてのリンクを、すべての既存ノードのデータセットに含まれるエッジのデータセットから取得したいとします。Spark Dataset:値が他のデータセットに含まれている場合のフィルタ

エッジ列:| dst | src |タイプ| (すべての文字列)

ノードの列:| id | pageid | (すべての文字列)

私はデータセットからリストを取得し、contains()メソッドを使用しました。

List<String> allNodeList = allNodes.javaRDD().map(r -> r.getString(0)).collect(); 
Dataset<Row> allLinks = dfEdges.filter("type = 'link'").filter(r -> allNodeList.contains(r.getString(1))); 

しかし、私はこのコードを削除してより自然な方法で使いたいと思っています。私のアプローチは、カウントを使用することでしたが、NotSerializableExceptionのために動作しないようです。

Dataset<Row> allLinks = dfEdges.filter("type = 'link'").filter(r -> (dfNodes.filter("id="+r.getString(1)).count()>0)); 

Javaでこの問題を解決する簡単な方法はありますか?私はスカラーで物事を "見ている"かそれと同様に見ましたが、単純にそれをJavaでどのように解決するのか分かりません。

答えて

2

はい、javaの問題を解決する簡単な方法があります。しかし、joinを介してのみ。このように:

Dataset<Row> allLinks = dfEdges.filter("type = 'link'").join(dfNodes, dfEdges.col("src").equalTo(dfNodes.col("id"))).drop("dst", "src", "type"); 

希望の結果が得られます。

私はそれが助けてくれることを願っています!

+0

実際には、ありがとう! 'join 'の使用については考えましたが、実際には理解できませんでした。しかし、今私はあなたのアプローチからさらなる解決策を引き出すことができます。 –

関連する問題