«Расширить» запрос HIVE с помощью другого столбца: производительность и лучшие практики - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть запрос HIVE, который вычисляет некоторые значения с использованием GROUP BY.

SELECT 
  COUNT(DISTINCT user_id),
  date,
  operating_system,
  action
FROM user_actions
GROUP BY date, operation_system, action;

Этот запрос корректно возвращает мой первый результат, то есть число уникальных пользователей, которые выполнили каждое действие на каждомплатформа на каждый день.

Теперь я также хочу подсчитать общее количество уникальных пользователей для каждой операционной системы в каждый день и добавить это в виде столбца.Таким образом, мы можем сравнить количество пользователей, выполнивших каждое действие, с общим количеством пользователей на этой платформе / день.

Моя попытка была следующей:

SELECT 
  COUNT(DISTINCT user_id),
  date,
  operating_system,
  action,
  COUNT(DISTINCT user_id) OVER (PARTITION BY operation_system, date) AS TOTAL
FROM user_actions
GROUP BY date, operation_system, action;

Мне было интересно,между ними есть лучшая практика.Первый, кажется, даже не работает правильно?Я думаю, что это потому, что раздел вычисляется ПОСЛЕ GROUP BY, а не одновременно.

Если это так, то в соответствии с этим: https://www.postgresql.org/docs/9.0/tutorial-window.html, Я могупереместить мою функцию, которая вычисляет итог, в подзапрос, а затем выбрать из этого, но это кажется "хакерским".

1 Ответ

0 голосов
/ 14 февраля 2019

Запрос

Если вы хотите посчитать количество уникальных пользователей за операционную систему в день, вам не нужно action в первом запросе.

SELECT 
  COUNT(DISTINCT user_id),
  date,
  operating_system
FROM user_actions
GROUP BY date, operation_system;

Когда вы используете агрегатную функцию окна , тогда вам не нужно выражение group by в конце.

SELECT 
  date,
  operating_system,
  COUNT(DISTINCT user_id) OVER (PARTITION BY operation_system, date) AS TOTAL
FROM user_actions;

Производительность и лучшееПрактики

Здесь нет универсального ответа, производительность запроса зависит от многих факторов, таких как индексы и объединения.В зависимости от требований вашего запроса вам нужно определиться с подходом, который вы хотите выбрать.

Оконная функция работает с множеством строк и выполняет для них вычисления.При наличии большой таблицы обычно подзапрос является плохой идеей для оконной функции , так как подзапрос должен содержать все промежуточные результаты.

В вашем случае вы используете Функция агрегатирования окон , которая не будет значительно лучше, если вы сделаете это, используя groupby.

...