Как сопоставить строковое выражение с шаблоном в функции array_contains в улье?

#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%';