大型数据数据处理的分布式计算

时间:2018-07-19 13:12:40

标签: scala apache-spark distributed-computing

我有大量的时间序列数据,我想使用spark的并行处理/分布式计算进行数据处理。 要求是逐行查看数据以确定在期望结果部分下指定的组,如果没有执行者之间的某种协调,我真的无法获得分配它的动力。

t- timeseries datetime sample,
lat-latitude,
long-longitude


例如:用一小部分示例数据集来解释这种情况

t   lat long
0   27  28
5   27  28
10  27  28
15  29  49
20  29  49
25  27  28
30  27  28 

所需的输出应为:

Lat-long    interval
(27,28) (0,10)
(29,49) (15,20)
(27,28) (25,30)

使用这段代码,我可以获得预期的结果

val spark = SparkSession.builder().master("local").getOrCreate()

import spark.implicits._

 val df = Seq(
  (0, 27,28),
  (5, 27,28),
  (10, 27,28),
  (15, 26,49),
  (20, 26,49),
  (25, 27,28),
  (30, 27,28)
).toDF("t", "lat","long")

val dfGrouped = df
.withColumn("lat-long", struct($"lat", $"long"))

val wAll = Window.partitionBy().orderBy($"t".asc)

dfGrouped.withColumn("lag", lag("lat-long", 1, null).over(wAll))
.orderBy(asc("t")).withColumn("detector", when($"lat-long" === $"lag", 0)
    .otherwise(1)).withColumn("runningTotal", sum("detector").over(wAll))
.groupBy("runningTotal", "lat-long").agg(struct(min("t"), max("t")).as("interval"))
.drop("runningTotal").show
}

但是如果数据进入两个执行器,那么数据将像

执行器1中的数据:

t   lat long
0   27  28
5   27  28
10  27  28
15  29  49
20  29  49
25  27  28

执行器2中的数据:

t   lat long
30   27  28


我应该如何获取大量数据的期望输出。必须有更聪明的方法来做到这一点,并在执行者之间进行某种形式的协调,以得到结果。

请指导我正确的方向,我已经进行了相同的研究,但未能找到解决方案。

PS:这只是一个示例。

1 个答案:

答案 0 :(得分:-1)

您可以使用UDAF解决此问题。 首先,您可以添加一个列,该列代表在您拥有的许多执行程序中划分的t列。像executorIndex = t%((max(t)-min(t))/ numExecutors)之类的东西。

然后,您可以按executorIndex应用UDAF分组。

您的UDAF需要存储一个带有字符串键(例如)的Map,该键表示一对经纬度对,而int []则表示此经纬度键的maxT和minT。

请询问您是否需要更详细的说明。

希望获得帮助...

PS:我想说的是,同一纬度和经度之间存在时间关系,如果您正在跟踪某些运动,这是正常现象...