2017-08-05 36 views
2

我想從邊數據集中獲取所有鏈接,其源包含在所有現有節點的數據集中。Spark數據集:如果值包含在其他數據集中,則進行過濾

邊欄: 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))); 

但現在我想消除額外的一段代碼,並使用更原生的方式。我的方法是使用count,但由於NotSerializableException,這似乎不起作用。

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

是否有任何簡單的方法來解決在java中的這個問題?我看到了與「is in」或類似的scala中的東西,但不知道如何簡單地用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'但並不真正理解。但是現在我可以從你的方法中獲得更多的解決方案。 –