Hive数据根据时间戳选择最新值

时间:2014-02-05 23:07:34

标签: hive hiveql

我有一个包含以下列的表。

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实现这一目标?

我目前正在使用hive 0.10。我不能将子查询与IN或EXISTS一起使用。

感谢。

2 个答案:

答案 0 :(得分:6)

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;

执行结构的最大值比较第一个字段,然后是第二个字段,等等。因此,如果您将所有内容组合在一起,首先使用解析的时间戳值,您将得到一个表示该行的结构。然后通过选择单个字段来解构它。

答案 1 :(得分:4)

你应该强烈考虑升级Hive,这可以通过使用row_number(由ProcessTimeStamp desc按c1顺序分区)中的包含在Hive 11+中的窗口函数在子选择中选择外部选择中的第一行来轻松完成。

您无需更新整个群集即可升级Hive,只需将其部署到一个节点即可。