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

luaexgnf  于 2021-06-27  发布在  Hive
关注(0)|答案(0)|浏览(259)

假设我有以下数据:

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中,我可以根据玩家的id来分组,然后设置位置的大小写,当它='进攻'或'防守'时,将相关的wins值拉到自己的列中,然后用coalesce()来 Package 每个大小写,以防止空值通过。超快速。
在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

现在,在我的现实世界中,原始数据集有6个“stats”数组的示例,每个示例包含3-5对的Map。正因为如此,兽人的table从重复的侧面视图中列出了700次玩家id。
整个表是30万行,而在现实世界示例中,player\u id在这个表上被复制了700多次。
问题1-这是将数据转换为所需最终结果的唯一和/或正确方法吗?问题2-完成此查询是否需要5到10秒?小型mysql服务器上的同一个数据集可以在毫秒内完成这项工作。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题