2014-02-05 92 views
1

我有一個表格,其中包含以下列。Hive根據時間戳選擇最新值的數據

C1,C2,Process TimeStamp,InsertDateTimeStamp 
p1,v1,2014-01-30 12:15:23,2013-10-01 05:34:23 
p1,v2,2014-01-31 05:11:34,2013-12-01 06:12:31 
p1,v3,2014-01-31 07:16:05,2012-09-01 07:45:20 
p2,v4,2014-02-01 09:22:52,2013-12-01 06:12:31 
p2,v5,2014-02-01 09:22:52,2012-09-01 07:45:20 

現在,我想根據最新Process TimeStamp獲取每個主鍵的唯一行。

如果Process TimeStamp是相同的,則應該選擇具有最新的InsertDateTimeStamp的行。

所以,我的結果應該是。

p1,v3,2014-01-31 07:16:05,2012-09-01 07:45:20 
p2,v4,2014-02-01 09:22:52,2013-12-01 06:12:31 

如何通過HiveQL實現此目的?

我目前使用配置單元0.10。我不能在IN或EXISTS中使用子查詢。

謝謝。

回答

4
select C1, s.C2, s.ProcessTimeStamp, s.InsertDateTimeStamp from (
    select C1, max(named_struct('unixtime', unix_timestamp(ProcessTimeStamp, 'yyyy-MM-dd HH:mm:ss'), 'C2', C2, 'ProcessTimeStamp', ProcessTimeStamp, 'InsertDateTimeStamp', InsertDateTimeStamp)) as s 
    from my_table group by C1 
) t; 

做一個結構的最大比較第一場,然後是第二場,等等。所以,如果你第一個結構都在一起,解析出的時間戳值,你會得到代表該行一個結構。然後,通過選擇各個字段來解除結構化。

+0

謝謝。它的工作:) – jigarshah

4

你應當認真考慮升級蜂房,這可以很容易地與包括在蜂巢11+使用ROW_NUMBER(分區由C1爲了通過ProcessTimeStamp DESC)在子選擇在外部選擇,選擇第一行中的窗函數完成。

您不需要更新整個羣集來升級Hive,只需將其部署到一個節點即可。