Как правильно сделать условную агрегацию в Hive - PullRequest
0 голосов
/ 14 ноября 2018

Предположим, у меня есть эти данные:

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 я могу просто group_by player_id, затем указать позицию, вытягивая соответствующее значение выигрышей, когда оно = 'оскорбление'или «защита» в свои собственные столбцы, затем оберните каждый случай в COALESCE (), чтобы предотвратить попадание нулей.Сверхбыстрый.

В Hive вместо COALESCE я должен использовать MIN или MAX, но результат будет одинаковым независимо.

Вот основной способ запроса этих данных:

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

Теперь, в моей реальной ситуации, в исходном наборе данных есть шесть экземпляров этого массива stats, каждый из которых содержит карту 3-5пар.По этой причине в таблице ORC player_id перечислен примерно 700 раз из повторяющихся боковых представлений.

Вся таблица состоит из 300 тыс. Строк, а в реальном примере player_id дублируется на этой таблице чуть более 700 раз.

Вопрос 1 - это единственный и / или правильный способ преобразования данных в желаемый конечный результат? Вопрос 2 - должен ли этот запрос занимать от 5 до 10 секунд?Тот же набор данных на небольшом сервере MySQL сделает это за миллисекунды.

...