0

Hive でクエリを作成するか、次のことを行う必要がある関数を定義する必要があります。

データセット:

Student || Time    || ComuputerPool
-------------------------------------
  A     ||  9:15AM ||  Pool1.Machine2
-------------------------------------
  A     ||  9:45AM ||  Pool1.Machine7
-------------------------------------
  A     ||  10:15AM||  Pool1.Machine9
-------------------------------------
  A     ||  11:00AM||  Pool2.Machine2
-------------------------------------
  A     ||  12:05  ||  Pool2.Machine3
-------------------------------------
  A     ||  12:40  ||  Pool3.Machine5
------------------------------------- 
  A     ||  13:10  ||  Pool1.Machine3
-------------------------------------
  A     ||  13:50  ||  Pool1.Machine10
-------------------------------------
  B   ..........................

そのため、クエリは、特定の学生が特定のコンピューター プールで最初にマシンを使用したときと、別のプールで最初にマシンを使用し始めたときの差を計算することによって、その学生が特定のコンピューター プールで過ごした時間を調べる必要があります。したがって、この例では、彼が費やした時間は次の差になります: 11:00AM - 9:15AM = 1Hour45Mins

ここでの質問は、1 つのストア時間値で最初に使用したものをマークし、後で次のプール データを見つけたときにそれを使用する方法です。

4

1 に答える 1

1

Hive は をサポートしているrow_number()ため、連続した値をグループ化するためのトリックを使用できます。2 つの行番号の差によってグループが定義され、これを集計に使用できます。結果のクエリは次のようになります。

select student, grp, min(time), max(time)
from (select t.*,
             (row_number() over (partition by student order by time) -
              row_number() over (partition by student, computerpool order by time)
             ) as grp
      from dataset t
     ) t
group by student, grp, computerpool;

編集:

あなたの質問は、マシンではなくプールに関するものです。したがって、おそらく期間の前の部分だけを気にします。(ちなみに、この情報は別の列に保存する必要があります)。

select student, substr(computerpool, 1, 6), min(time), max(time)
from (select t.*,
             (row_number() over (partition by student order by time) -
              row_number() over (partition by student, substr(computerpool, 1, 6) order by time)
             ) as grp
      from dataset t
     ) t
group by student, grp, substr(computerpool, 1, 6);
于 2015-05-29T13:31:39.310 に答える