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

时间:2019-02-28 10:29:56

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

在代码的某一时刻,我有两个不同类型的数据集。我需要将数据从一个过滤到另一个。假设没有办法从现在开始更改代码,是否有任何方法可以执行我在下面的注释中描述的操作,而无需从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));

我们将不胜感激任何建议,甚至为避免此类情况提供更好的设计帮助。

1 个答案:

答案 0 :(得分:1)

不改变方法,不行!这是不可能的,因为在map块中,您不能直接使用驱动程序的抽象(数据集,数据框或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)),然后将过滤器应用于所需的逻辑。