Фильтрация массивов в улье - PullRequest
1 голос
/ 19 марта 2020

У меня есть таблица кустов, в которой у меня есть столбец с именем paid_value в формате массива для каждой записи.

Теперь я хочу отфильтровать массив так, чтобы значение было между 1000 и 10000 для каждой записи.

Я не знаю, как это сделать.

Я знаю функцию array_contains(Array<T>, value), но это не решает мою проблему, так как она принимает только одно значение в качестве критерия проверки, но мне нужно, как «между 1000 и 10000».

1 Ответ

0 голосов
/ 19 марта 2020

Вы можете использовать LATERAL VIEW EXPLODE, чтобы взорвать массив, а затем выполнить фильтр впоследствии. Но если размер вашего массива огромен, ваш процесс будет медленным.

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

- это даст вам массив чисел между началом (st) и концом (ed)

select collect_set(pe.i+1) as range_array
from
(SELECT 1000 as st, 1100 as ed) t
LATERAL VIEW posexplode(split(space(ed-st),' ')) pe AS i,x;

Тогда я использую кирпичный дом UDF bhouse_intersect_array

select count(1)
from range_array cross join <source_tablename>
where size(bhouse_intersect_array(source_array, range_array)) > 0
...