2017-09-04 1 views
0

私は開始または停止できるサービスを持っています。各操作は、タイムスタンプと操作タイプのレコードを生成します。最終的に、私は一連のタイムスタンプの操作記録に終わります。今私は1日中のサービスの稼働時間を計算したいと思う。アイデアは簡単です。スタート/ストップレコードの各ペアについて、タイムスパンと合計を計算します。しかし、可能であれば、ハイブでそれを実装する方法はわかりません。このために中間結果を格納するためのテーブルを作成するのは問題ありません。これは主なブロッキングの問題であり、その他の小さな問題もあります。たとえば、開始/停止ペアの中には、1日にまたがるものがあります。どのようにこの小さな問題に対処するか考えても感謝します。Hiveスクリプトを使用して各開始/終了ペアの処理時間を設定します

サンプルデータ:

Timestamp    Operation 
...      ... 
2017-09-03 23:59:00  Start 
2017-09-04 00:01:00  Stop 
2017-09-04 06:50:00  Start 
2017-09-04 07:00:00  Stop 
2017-09-05 08:00:00  Start 
...      ... 

サービスのアップタイム2017-09-04が、その後1 + 10 = 11分べきであるため。最初の時間間隔は09-0309-04にわたっており、09-04に含まれる部分だけがカウントされます。

+0

あなたは、入力/出力に関するいくつかの例を与えることができますか? – hlagos

+0

必要な結果を含むデータサンプル(〜10行)をテーブル形式で追加します。 –

+0

@DuduMarkovitz例を追加しました。ありがとうございます。 – Lingxi

答えて

1
select  to_date(from_ts)             as dt 
      ,sum (to_unix_timestamp(to_ts) - to_unix_timestamp(from_ts))/60 as up_time_minutes 

from  (select  case when pe.i = 0      then from_ts else cast(date_add(to_date(from_ts),i) as timestamp) end as from_ts 
         ,case when pe.i = datediff(to_ts,from_ts) then to_ts else cast(date_add(to_date(from_ts),i+1) as timestamp) end as to_ts 

      from  (select `operation` 
           ,`Timestamp`          as from_ts 
           ,lead(`Timestamp`) over (order by `Timestamp`) as to_ts 

         from t 
         ) t 

         lateral view posexplode(split(space(datediff(to_ts,from_ts)),' ')) pe as i,x 

      where  `operation` = 'Start' 
        and to_ts is not null 
      ) t 

group by to_date(from_ts) 
; 

+------------+-----------------+ 
|  dt  | up_time_minutes | 
+------------+-----------------+ 
| 2017-09-03 | 1.0    | 
| 2017-09-04 | 11.0   | 
+------------+-----------------+ 
関連する問題