我是以飞行形式的航班数据集
+----------------+----------+-------------+
|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行中,我想让帧范围从CURRENT ROW延伸到arrival_ts + 7200,但显然我不能在spark中做动态范围,不是吗?
在第1行并假设2个航班具有相同的到达时间,这将使得当CURRENT_ROW指针在那里移动时无法检索第二个航班的值,因为第一次航班和第二次航班之间的差异为0。是否可以明确告诉范围从CURRENT_ROW开始构图?
在第2行中,我想检索帧的第一行的depart_ts值,以与帧中的其他航班进行比较。有可能做到这一点。我尝试了first()函数,但它并不适合我的情况。