当满足特定条件时,如何逐行迭代配置单元表并计算指标?

时间:2019-05-28 14:53:41

标签: hadoop hive

我有如下要求:

我正在尝试将MS Access表宏循环转换为可用于配置单元表。名为trip_details的表格包含有关卡车进行的特定行程的详细信息。叉车可以在多个位置停车,停车类型由称为type_of_trip的标志指示。此列包含诸如arrivaldepartureloading等的值。

最终目的是计算每辆卡车的停留时间(卡车开始下一次旅行之前要花费多少时间)。要计算此值,我们必须逐行迭代表并检查行程类型。

一个典型的示例如下:

在文件结束时执行:

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

结束

解决蜂巢中此问题的最佳方法是什么?

我尝试检查配置单元是否包含用于循环的关键字,但找不到一个。我当时在考虑使用Shell脚本执行此操作,但需要有关如何实现此操作的指南。

我无法透露全部数据,但可以随时在评论部分提出任何问题。

输入

旅行ID 旅行类型 时间戳 位置

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  

预期产量

旅行ID 原始位置 目标位置 停留时间

1        Warehouse        Store                2 hours

1 个答案:

答案 0 :(得分:1)

您不需要为此循环,请使用SQL查询的功能。

将时间戳转换为秒(使用指定的格式'dd/MM/yyyy HH:mm'),计算每个trip_id的最小值和最大值,并考虑类型,减去秒,将秒差转换为'HH:mm'格式或{{3} }:

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