#sql #arrays #string #hive
#sql #массивы #строка #улей
Вопрос:
Рассмотрим столбец A как массив строк. Теперь я хотел бы выполнить поиск по всем строкам в таблице, чтобы иметь строку определенного шаблона. Я знаю, что функция array_contains() может использоваться для проверки точных совпадений, но есть ли способ проверить соответствие шаблону?
select * from table
where array_contains(A,"3%");
Возможно ли подобное сопоставление с шаблоном?
Ответ №1:
Сначала сгенерируйте номер строки. Затем разбейте столбец вашего массива на вид сбоку, затем отфильтруйте строки, которые не соответствуют шаблону, например,
with table1 as (
select row_number() over () as rnum, *
from your_table
),
table2 as (
select *, arr
from table1 lateral view explode(A) tmp as arr
where arr like '3%'
),
table3 as (
select distinct rnum from table2
)
select *
from table1 t1
left semi
join table3 t3
on t1.rnum = t3.rnum
Ответ №2:
Я думаю, вы можете использовать:
select distinct t1.*
from table1 t1 lateral view
explode(t1.A) tmp as arr
where arr like '3%';
Есть способ устранить select distinct
, но я не уверен, поддерживает ли его Hive:
select t1.*
from table1 t1
where exists (select 1
from explode(t1.A) as arr
where arr like '3%'
);
Или вы можете использовать этот несколько запутанный метод:
select t1.*
from table1 t1
where concat_ws('|', t1.A) like '3%';