#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 (например, «создать индекс»).