【问题标题】:Spark Dataset: Filter if value is contained in other datasetSpark数据集:过滤值是否包含在其他数据集中
【发布时间】:2017-08-05 00:38:46
【问题描述】:

我想从边数据集中获取所有链接,其源包含在所有现有节点的数据集中。

边缘列:| dst |源代码 |类型 | (所有字符串)

节点列:|编号 |页码 | (所有字符串)

我通过从数据集中检索一个列表并使用 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 apache-spark spark-dataframe apache-spark-dataset


    【解决方案1】:

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

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

    它会给你想要的结果。

    希望对你有帮助!

    【讨论】:

    • 确实如此,谢谢!想过用join,但不是很明白。但现在我可以从您的方法中获得更多解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 2014-02-14
    • 2023-03-26
    相关资源
    最近更新 更多