如何逐行迭代 Hive 表并在满足特定条件时计算指标?

问题描述 投票:0回答:1

我正在尝试将 MS Access 表宏循环转换为适用于 Hive 表。名为

trip_details
的表包含有关卡车特定行程的详细信息。卡车可以在多个位置停车,停车类型由名为
type_of_trip
的标志指示。此列包含
arrival
departure
loading
等值。

最终目标是计算每辆卡车的停留时间(卡车在开始另一次行程之前需要多长时间)。为了计算这个,我们必须逐行迭代表并检查行程类型。

一个典型的例子如下:

在文件末尾执行以下操作:

  1. 将第一行存储在变量中。
  2. 移至第二行。
  3. 如果 type_of_trip = 到达:
    移至第三行
  4. 如果 type_of_trip = 结束行程:
    存储第三行
    取时间戳的差异来计算停留时间
  5. 将行追加到输出表中

结束

在 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
hadoop hive
1个回答
1
投票

您不需要为此循环,使用 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   
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.