Presto - Как я могу фильтровать значения массива, которые происходят последовательно - PullRequest
2 голосов
/ 25 июня 2019

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

Я попытался использовать функцию "array_distinct" & "transform" в presto, но не смог прогрессировать.Так как array_distinct дает только отличные значения, а не то, что я ожидаю

Input : [1,2,2,3,4,4,4,2]

Ожидаемый результат: [1,2,3,4,2]

Ответы [ 2 ]

6 голосов
/ 27 июня 2019

Вы можете проверять последовательные элементы, комбинируя ngrams, filter, transform, например:

presto> SELECT
     ->     ARRAY[a[1]] ||
     ->     transform(
     ->         filter(
     ->             ngrams(a, 2),
     ->             pair -> pair[1] IS DISTINCT FROM pair[2]),
     ->         pair -> pair[2])
     -> FROM (VALUES ARRAY[1,2,2,3,4,4,4,2]) t(a);
      _col0
-----------------
 [1, 2, 3, 4, 2]
(1 row)
1006 * * Пояснение:
  • ngrams(a, 2) строит родственные пары
  • filter затем используется для сохранения только тех элементов, которые не обработаны идентичным; IS DISTINCT FROM используется для более NULL -дружественного сравнения, чем обычное =.
  • transform используется для преобразования из братьев и сестер обратно в плоский массив
  • первый элемент добавляется спереди (иначе он всегда будет отсутствовать)

См. https://prestosql.io/docs/current/functions/array.html для всех доступных функций массива.

1 голос
/ 26 июня 2019

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

https://geeks.jampp.com/data-infrastructure/technology/writing-custom-presto-functions/

https://www.qubole.com/blog/plugging-in-presto-udfs/

Пользовательские функции в Presto

Вот алгоритм:

https://www.geeksforgeeks.org/python-remove-consecutive-duplicates-from-list/

...