我有一个包含以下列的表.
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
Run Code Online (Sandbox Code Playgroud)
现在,我想基于最新的每个主键获取唯一行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
Run Code Online (Sandbox Code Playgroud)
如何通过HiveQL实现这一目标?
我目前正在使用hive 0.10.我不能将子查询与IN或EXISTS一起使用.
谢谢.
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;
Run Code Online (Sandbox Code Playgroud)
做一个struct的最大值比较第一个字段,然后是第二个字段,等等.所以如果你把所有东西一起构造,首先用解析的时间戳值,你得到一个表示该行的结构.然后通过选择单个字段来解构它.
小智 5
您应该强烈考虑升级Hive,这可以通过Hive 11+中包含的窗口函数轻松完成,方法是在子选择中使用row_number(按c1顺序进行分区,由ProcessTimeStamp desc进行选择),然后选择外部选择中的第一行。
您无需更新整个群集即可升级Hive,只需将其部署到一个节点即可。
| 归档时间: |
|
| 查看次数: |
6737 次 |
| 最近记录: |