我有一个包含以下列的表。
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一起使用。
感谢。
答案 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,只需将其部署到一个节点即可。