首页 > 解决方案 > 在 Spark 中比较跨执行程序的数据

问题描述

我们有一个 Spark 应用程序,其中数据在不同的执行者之间共享。但是我们还需要比较executor之间的数据,其中一些数据存在于executor-1中,而一些数据存在于executor-2中。我们想知道如何在 spark 中实现?

例如:有一个包含以下详细信息的文件:

Name, Date1, Date2
A, 2019-01-01, 2019-01-23
A, 2019-02-12, 2019-03-21
A, 2019-04-01, 2019-05-31
A, 2019-06-02, 2019-12-30
B, 2019-01-01, 2019-01-21
B, 2019-02-10, 2019-03-21
B, 2019-04-01, 2019-12-31

我需要通过检查第一行的 date2、第二行的 date1 等等来找到这些元素之间的总差距。即

例如:对于名称 A:(2019-02-12 - 2019-01-23) + (2019-04-01 - 2019-03-21) + (2019-06-02 -2019-05-31) + ( 2019-12-31 - 2019-12-30) .. 年份在 2019-12-31 结束,因此有 1 天的差距,并且差距的数量(如果每个日期的上述公式之间的差异 > 0)将为 4 .

对于名称 B:(2019-02-10 - 2019-01-21) + (2019-04-01 - 2019-03-21),间隔数为 2。

一种方法是使用collectAsList(),它将所有数据检索到驱动程序,但是是否有不同的有效方法可以直接在执行程序之间进行比较,如果是,我们该怎么做?

标签: apache-sparkhadoop

解决方案


只需编写一个带有延迟窗口、限定条件的 SQL 查询,检查相邻行的日期广告日期减 1,主要关键限定条件是名称。在名称中也进行排序。

您不必担心 Executor,Spark 会根据 Name 自动为您散列到由 Executor 服务的 Partition。


推荐阅读