2015-05-29 33 views
0

我需要寫在蜂巢查詢或定義需要做如下的功能:如何使用標準查詢或使用UDF標記一行並將其特定值存儲在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:00 AM - 9:15 AM = 1Hour45Mins

我的問題在於如何在一個存儲時間值中標記第一次使用並稍後使用它時我找到下一個池數據。

+0

你的問題似乎是明確地關於Hive,所以我刪除了mysql標記。 –

回答

1

Hive支持row_number(),所以你可以使用一個技巧來分組順序值。兩行號之間的差別定義了一個組,然後可以將其用於聚合。結果查詢是這樣的:

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); 
+0

儘管他們處於不同的時間,但由於它應該將游泳池視爲不同的游泳池,因此儘快將游泳池分爲不同的游泳池,並考慮將下次遊覽視爲新遊戲團 – dhssa

+0

@dhssa。 。 。我認爲這就是這個查詢所做的。 –

+0

我運行它,並將其分組到一個組中,無論其時間框架,並從1,2,...編號。預期:1.訪問Pool1的數量爲1,2,..並且第二次訪問Pool1的次數從1,2,..., – dhssa

相關問題