我正在尝试将 MS Access 表宏循环转换为适用于 Hive 表。名为
trip_details
的表包含有关卡车特定行程的详细信息。卡车可以在多个位置停车,停车类型由名为 type_of_trip
的标志指示。此列包含 arrival
、departure
、loading
等值。
最终目标是计算每辆卡车的停留时间(卡车在开始另一次行程之前需要多长时间)。为了计算这个,我们必须逐行迭代表并检查行程类型。
一个典型的例子如下:
在文件末尾执行以下操作:
- 将第一行存储在变量中。
- 移至第二行。
- 如果 type_of_trip = 到达:
移至第三行- 如果 type_of_trip = 结束行程:
存储第三行
取时间戳的差异来计算停留时间- 将行追加到输出表中
结束
在 hive 中解决这个问题的最佳方法是什么?
我尝试检查 hive 是否包含 for 循环关键字,但找不到。我正在考虑使用 shell 脚本来执行此操作,但需要有关如何处理此问题的指导。
我无法透露全部数据,但请随时在评论部分提出任何问题。
输入
Trip ID type_of_trip timestamp location
1 Departure 28/5/2019 15:00 Warehouse
1 Arrival 28/5/2019 16:00 Store
1 Live Unload 28/5/2019 16:30 Store
1 End Trip 28/5/2019 17:00 Store
预期输出
Trip ID Origin_location Destination_location Dwell_time
1 Warehouse Store 2 hours
您不需要为此循环,使用 SQL 查询的强大功能。
将时间戳转换为秒(使用指定的格式
'dd/MM/yyyy HH:mm'
),计算每个 trip_id 的最小值和最大值,考虑类型,减去秒数,将秒差转换为 'HH:mm'
格式或您喜欢的任何其他格式:
with trip_details as (--use your table instead of this subquery
select stack (4,
1,'Departure' ,'28/5/2019 15:00','Warehouse',
1,'Arrival' ,'28/5/2019 16:00','Store',
1,'Live Unload' ,'28/5/2019 16:30','Store',
1,'End Trip' ,'28/5/2019 17:00','Store'
) as (trip_id, type_of_trip, `timestamp`, location)
)
select trip_id, origin_location, destination_location,
from_unixtime(destination_time-origin_time,'HH:mm') dwell_time
from
(
select trip_id,
min(case when type_of_trip='Departure' then unix_timestamp(`timestamp`,'dd/MM/yyyy HH:mm') end) origin_time,
max(case when type_of_trip='End Trip' then unix_timestamp(`timestamp`,'dd/MM/yyyy HH:mm') end) destination_time,
max(case when type_of_trip='Departure' then location end) origin_location,
max(case when type_of_trip='End Trip' then location end) destination_location
from trip_details
group by trip_id
)s;
结果:
trip_id origin_location destination_location dwell_time
1 Warehouse Store 02:00