Spark SQL: найти максимум и сумму, сгруппированные по ключу

#sql #apache-spark-sql #spark-dataframe

#sql #apache-spark-sql

Вопрос:

У меня есть фрейм данных Spark со следующей схемой.

 counts
 |-- index: string
 |-- name: string
 |-- count: long
  

Я хотел бы просуммировать count столбец для каждого index , а также найти максимум count вместе с соответствующим name . Таким образом, каждая строка будет содержать уникальный index символ with SUM(count) MAX(count) и соответствующий name .

Я группирую записи по index и выбираю строку с наибольшим count значением, выполнив следующий запрос.

 SELECT * FROM counts 
WHERE (index, count) 
IN (
    SELECT index, MAX(count) 
    FROM counts
    GROUP BY index
)
ORDER BY count DESC
  

Это отлично работает и дает мне уникальную строку index , содержащую строку с наибольшим count значением.

Тем не менее, я хотел бы добавить столбец, содержащий сумму count сгруппированных по index на основе исходной таблицы.

Я могу суммировать количество просмотров и группировать их index с помощью этого запроса:

 SELECT index, SUM(count)
FROM counts
GROUP BY index
  

Но я хотел бы иметь единую таблицу, содержащую результаты обоих запросов (запрашиваемых эффективным способом).

Любые предложения по этому вопросу приветствуются.

Ответ №1:

Просто используйте оконные функции:

 SELECT c.*
FROM (SELECT c.*, SUM(count) OVER (PARTITION BY index) as cnt,
             ROW_NUMBER() OVER (PARTITION BY index ORDER BY count DESC) as seqnum
      FROM counts c
     ) c
WHERE seqnum = 1;
  

Предполагается, что у вас есть другие столбцы, которые вы хотите сохранить. Если вам просто нужны max и sum для каждого index :

 SELECT index, MAX(count), SUM(count)
FROM counts
GROUP BY index;
  

И index — плохое название для столбца, потому что это ключевое слово SQL (например, «создать индекс»).