如何在Hive中正确进行条件聚合

时间:2018-11-13 21:51:47

标签: hive aggregation

假设我有此数据:

player_id  stats
100        [{"position":"offense","wins":35},{"position":"defense","wins":17}]
200        [{"position":"offense","wins":85},{"position":"defense","wins":52}]
300        [{"position":"offense","wins":12},{"position":"defense","wins":98}]

我想这样显示它:

player_id  offense_wins  defense_wins
100        35            17
200        85            52
300        12            98

上面的原始数据当前使用以下方法放入ORC表中:

SELECT p.player_id
     , s.position
     , s.wins
FROM player_stats p
LATERAL VIEW EXPLODE(p.stats) sTable as s

哪个会吸引我:

player_id  position  wins
100        offense   35
100        defense   17
200        offense   85
200        defense   52
300        offense   12
300        defense   98

现在从MySQL的这一点开始,我可以只对player_id进行分组,然后对位置进行大小写,将关联的获胜值=“进攻”或“防守”拉入自己的列,然后将每种情况包装在COALESCE()中防止空值通过。超级快。

在Hive中,我必须使用MIN或MAX来代替COALESCE,但是无论如何,结果都是相同的。

以下是查询此数据的主要方式:

SELECT player_id
     , max(case when position = 'offense' then wins end) as offense_wins
     , max(case when position = 'defense' then wins end) as defense_wins
FROM orctable
WHERE player_id = 100
GROUP BY player_id

这将导致:

player_id  offense_wins  defense_wins
100        35            17

现在,在我的现实世界中,原始数据集具有该“统计”数组的六个实例,每个实例包含3-5对映射。因此,ORC表从重复的侧视图中列出了player_id约700次。

整个表有30万行,真实示例中的player_id在此表上重复了700多次。

问题1 -这是将数据转换为所需最终结果的唯一和/或适当的方法吗? 问题2 -此查询是否需要5到10秒才能完成?小型MySQL服务器上的相同数据集将在毫秒内完成此操作。

0 个答案:

没有答案