【问题标题】:Spark - Iteration between Datasets without collecting dataSpark - 数据集之间的迭代而不收集数据
【发布时间】:2019-07-22 05:43:17
【问题描述】:

在我的代码的某个时刻,我有两个不同类型的数据集。我需要一个数据来过滤另一个数据。假设从这一点开始无法更改代码,有没有办法在不从 report2Ds 收集所有数据并在 Spark 函数中使用它的情况下执行我在下面的评论中描述的内容?

Dataset<Report1> report1Ds ...
Dataset<Report2> report2Ds ...

report1Ds.map((MapFunction<Report3>) report -> {

String company = report.getCompany();
// get data from report2Ds where report2.getEmployeer().equals(company);

}, kryo(Report3.class));

非常感谢任何建议,甚至是对更好设计的帮助以避免此类情况。

【问题讨论】:

标签: java apache-spark hadoop apache-spark-sql bigdata


【解决方案1】:

不改变你的方法不!这是不可能的,因为在地图块中,您不能直接使用驱动程序的抽象(数据集、数据帧或 Spark 上下文)。更多信息请参考以下链接:

Apache Spark : When not to use mapPartition and foreachPartition?

Caused by: java.lang.NullPointerException at org.apache.spark.sql.Dataset

另一种方法是识别两个数据集之间的链接字段,将它们连接起来(根据您的示例又称为 report1Ds.join(report2Ds, report1Ds.company == report2Ds.employeer)),然后根据您想要的逻辑应用过滤器。

【讨论】:

    猜你喜欢
    • 2019-01-08
    • 2018-02-08
    • 2021-03-09
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 2019-05-08
    相关资源
    最近更新 更多