Spark - 数据集之间的迭代,无需收集数据

问题描述 投票:1回答:1

在我的代码的某个时刻,我有两个不同类型的数据集。我需要一个数据来过滤数据到另一个。假设从这一点上无法改变代码,有没有办法在下面的注释中做我正在描述的内容而不收集来自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个回答
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)),然后根据您想要的逻辑应用过滤器。

© www.soinside.com 2019 - 2024. All rights reserved.