蜂巢 - 每小时平均窗口

时间:2015-10-08 01:28:44

标签: hadoop hive hdfs psql hiveql

我在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函数,但这可能不是最佳方式。

有什么想法吗?

1 个答案:

答案 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