Эффективно взять мин столбца с другим столбцом в качестве ключа - PullRequest
0 голосов
/ 09 ноября 2018

Я недавно перешел от использования Presto к Hive. У меня есть следующий сценарий. Столбцы A, B, C. Я хочу агрегировать по A и найти значение B, для которого значение C минимизировано. В Presto вы можете что-то вроде этого SELECT A, min_by(B, C) from <TABLE> GROUP BY A Теперь я хочу сделать то же самое в Улей. Но, к сожалению, я не смог найти UDF, подобный этому, нигде в документации. Теперь я знаю, что могу сделать следующее

SELECT A, COALESCE(B, 0)
from <TABLE> as primary
JOIN (
SELECT A, MIN(C) as C FROM <TABLE> GROUP BY A 
) secondary
ON primary.A = secondary.A AND primary.C = secondary.C\
GROUP BY A

У меня 2 проблемы с этим решением

  1. Это совсем не лаконично.
  2. Это тоже не эффективно. Я делаю дополнительный в результате подзапрос и дополнительное агрегирование и дополнительный JOIN. Было бы неплохо иметь поддержку агрегации первого класса для такой функции.

Есть ли способ достичь того, что я пытаюсь сделать, не написав свой пользовательский UDF?

1 Ответ

0 голосов
/ 09 ноября 2018

Объединение работает медленнее, чем аналитические функции, попробуйте этот подход без объединения, и таблица будет сканироваться только один раз:

select s.*
from
(
SELECT A, COALESCE(B, 0) as B, C
      min(C) over (partition by A) as min_C
from <TABLE> as primary
)s
where s.C=s.min_C;

Если вам нужно вычислить min (C) для большего количества столбцов группы, добавьте их в предложение partition BY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...