Spark Dataset:如果值包含在其他数据集中则进行过滤
Spark Dataset: Filter if value is contained in other dataset
我想从边缘数据集中获取所有链接,其源包含在所有现有节点的数据集中。
edges columns: | dst | src | type | (all strings)
nodes columns: | id | pageid | (all strings)
我通过从数据集中检索列表并使用 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中的那个问题吗?我在 scala 中看到了带有“is in”或类似内容的东西,但不知道如何在 java.
中简单地解决它
是的,有一个简单的方法可以解决java中的问题。但只能通过 join
。像这样:
Dataset<Row> allLinks = dfEdges.filter("type = 'link'")
.join(dfNodes, dfEdges.col("src")
.equalTo(dfNodes.col("id")))
.drop("dst", "src", "type");
它会给你想要的结果。
希望对您有所帮助!
我想从边缘数据集中获取所有链接,其源包含在所有现有节点的数据集中。
edges columns: | dst | src | type | (all strings)
nodes columns: | id | pageid | (all strings)
我通过从数据集中检索列表并使用 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中的那个问题吗?我在 scala 中看到了带有“is in”或类似内容的东西,但不知道如何在 java.
中简单地解决它是的,有一个简单的方法可以解决java中的问题。但只能通过 join
。像这样:
Dataset<Row> allLinks = dfEdges.filter("type = 'link'")
.join(dfNodes, dfEdges.col("src")
.equalTo(dfNodes.col("id")))
.drop("dst", "src", "type");
它会给你想要的结果。
希望对您有所帮助!