Spark数据集:过滤if值是否包含在其他数据集中

时间:2017-08-05 00:38:46

标签: java apache-spark spark-dataframe apache-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)));

但是现在我想要消除那段额外的代码并使用更原生的方式。我的方法是使用count,但由于NotSerializableException,这似乎不起作用。

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

有没有简单的方法来解决java中的问题?我已经在scala中看到了“is in”或类似内容,但不知道如何在java中解决它。

1 个答案:

答案 0 :(得分:4)

是的,有一种简单的方法可以解决java中的问题。但只能通过join。像这样:

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

它会给你想要的结果。

我希望它有所帮助!