使用Spark计算排序数据的离港航班

时间:2018-01-01 20:25:49

标签: scala apache-spark mapreduce window-functions

我是以飞行形式的航班数据集 +----------------+----------+-------------+ |flightID |depart_ts |arrival_ts | +----------------+----------+-------------+ |1 |1451603468| 1451603468| |2 |1451603468| 1451603468| |3 |1451603468| 1451603468| |4 |1451603468| 1451603468| |5 |1451603468| 1451603468| +----------------+----------+-------------+ 我的工作是使用Apache Spark在某些条件下找到每个航班的返程航班(返程航班B的起飞时间应在航班A抵达时间的2小时内)。执行1M记录的交叉连接以检查这些条件效率不高并且将花费很多时间。我已经考虑过使用带有1个分区和自定义UDAF的窗口函数来进行计算。像这样的东西

1. val flightsWindow = Window.orderBy("depart_ts").rangeBetween(0, 7200)


2. flights.withColumn("returnFlightID", calcReturn( $"arrival_ts", $"depart_ts").over(flightsWindow)).show()

考虑到这种方法将导致解决方案,我面临一些挑战:

  1. 在第1行中,我想让帧范围从CURRENT ROW延伸到arrival_ts + 7200,但显然我不能在spark中做动态范围,不是吗?

  2. 在第1行并假设2个航班具有相同的到达时间,这将使得当CURRENT_ROW指针在那里移动时无法检索第二个航班的值,因为第一次航班和第二次航班之间的差异为0。是否可以明确告诉范围从CURRENT_ROW开始构图?

  3. 在第2行中,我想检索帧的第一行的depart_ts值,以与帧中的其他航班进行比较。有可能做到这一点。我尝试了first()函数,但它并不适合我的情况。

0 个答案:

没有答案