Агрегирование столбца на основе значений столбца в Presto / Hive - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь создать набор данных, в котором я агрегирую столбец на основе значений другого столбца.Чтобы привести пример

 id      | score | id2 | offensive 
---------+-------+-----+-----------
 a1      | 1.2   | 1   | false     
 a2      | 36.0  | 1   | true      
 a3      | 1.2   | 1   | true      
 a4      | 36.0  | 1   | false  

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

 id      |id2  | clean_group | offensive_group
---------+-----+-------------+-----------------
 a1      | 1   | [a2, a3]    | [a4, a1]
 a2      | 1   | [a2, a3]    | [a4, a1]
 a3      | 1   | [a2, a3]    | [a4, a1]
 a4      | 1   | [a2, a3]    | [a4, a1]

Я знаю, что это избыточные данные, но это требование, и следует отметить, что все идентификаторы будут разными и уникальными, а идентификатор 2 будет одинаковым.Я пытался выполнить функцию array_agg в Presto и collect_set в улье, но у меня было много проблем.

Кто-нибудь может помочь?Можем ли мы как-то передать условия в совокупности, где мы говорим array_agg(id where offensive=true) и т. Д.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Учитывая, что наступательный столб - это строка, я думаю, это должно вам помочь

SELECT
 id,
 id2,
 CASE
  WHEN offensive = 'true' then concat_ws(',',collect_set(id))
 END AS clean_group,
 CASE
  WHEN offensive = 'false' then concat_ws(',',collect_set(id))
 END AS offensive_group
FROM
table_name; 
0 голосов
/ 29 мая 2018

Я думаю, что вы хотите агрегацию с синтаксисом фильтра: array_agg(id) filter (where offensive).Это обработает только те строки, которые соответствуют фильтру.

...