Сортировка внутри collect_list () в улье - PullRequest
0 голосов
/ 08 июня 2018

Допустим, у меня есть таблица улья, которая выглядит следующим образом:

ID    event    order_num
------------------------
A      red         2
A      blue        1
A      yellow      3
B      yellow      2
B      green       1
...

Я пытаюсь использовать collect_list для генерации списка событий для каждого идентификатора.Итак, что-то вроде следующего:

SELECT ID, 
collect_list(event) as events_list,
FROM table
GROUP BY ID;

Однако внутри каждого из идентификаторов, по которым я группирую, мне нужно отсортировать по order_num.Чтобы полученная таблица выглядела так:

ID    events_list
------------------------
A      ["blue","red","yellow"]
B      ["green","red"]

Я не могу выполнить глобальную сортировку по ID и order_num перед запросом collect_list (), потому что таблица массивна.Есть ли способ сортировки по order_num в collect_list?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 10 июня 2018

Итак, я нашел ответ здесь .Хитрость заключается в том, чтобы использовать подзапрос с операторами DISTRIBUTE BY и SORT BY.Смотрите ниже:

WITH table1 AS (
    SELECT 'A' AS ID, 'red' AS event, 2 AS order_num UNION ALL
    SELECT 'A' AS ID, 'blue' AS event, 1 AS order_num UNION ALL
    SELECT 'A' AS ID, 'yellow' AS event, 3 AS order_num UNION ALL
    SELECT 'B' AS ID, 'yellow' AS event, 2 AS order_num UNION ALL
    SELECT 'B' AS ID, 'green' AS event, 1 AS order_num
)

-- Collect it
SELECT subquery.ID, 
collect_list(subquery.event) as events_list
FROM (
SELECT
        table1.ID,
        table1.event,
        table1.order_num
    FROM table1
    DISTRIBUTE BY
        table1.ID
    SORT BY
        table1.ID,
        table1.order_num
) subquery
GROUP BY subquery.ID;
0 голосов
/ 08 августа 2019

Попробуйте следующее:

WITH tmp AS (
  SELECT * FROM data DISTRIBUTE BY ID SORT BY ID, order_num desc
)
SELECT ID, collect_list(event)
FROM tmp
GROUP BY ID
0 голосов
/ 09 июня 2018

Функция sort_array() должна сортировать collect_list() элементы

select ID, sort_array(collect_list(event)) as events_list,
from table
group by ID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...