我在Hive表中有这样的数据:
+-------------------+-------+---------+--------+
| _c0 | name | value0 | value1 |
+-------------------+-------+---------+--------+
| 2015-10-07 13:01 | john | 10.0 | 100 |
| 2015-10-07 13:20 | john | 20.0 | 200 |
| 2015-10-07 13:41 | john | 15.0 | 300 |
| 2015-10-07 14:00 | john | 30.0 | 300 |
| 2015-10-07 14:20 | john | 60.0 | 200 |
| 2015-10-07 14:40 | john | 30.0 | 400 |
我需要获得每小时的平均值。
| 2015-10-07 13:00 | john | 15.0 | 200 |
| 2015-10-07 14:00 | john | 40.0 | 300 |
我有一个想法是在psql中使用partition
/ over
子句来完成它,但我不确定如何在Hive中执行此操作。一个想法是将日期时间分为日期和小时(例如" 2015-10-07 13")并使用group by和avg函数,但这可能不是最佳方式。
有什么想法吗?
答案 0 :(得分:3)
你应该按照你建议的方式去做。如果您只想要按日期和小时(以及可能的名称)的平均值,则不需要分区和使用over子句。
<强>查询强>:
select date, hour, name, avg(value0) avg0, avg(value1) avg1
from (
select split(_c0, ' ')[0] date
, split(split(_c0, ' ')[1], '\\:')[0] hour
, name
, value0
, value1
from db.table ) x
group by date, hour, name