2014-02-05 158 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,只需将其部署到一个节点即可。