Как построить регулярное выражение в Hive, чтобы получить строку до N-го появления разделителя - PullRequest
1 голос
/ 17 января 2020

У меня есть некоторые примеры данных в Hive как

select "abc:def:ghi:jkl" as data
union all
select "jkl:mno:23ar:stu:abc:def:ghi:7345" as data

Я хочу извлечь строки до 3-го двоеточия, чтобы получить вывод как

abc:def:ghi
jkl:mno:23ar

Я хочу сохранить N как переменная, чтобы я мог уменьшить выходной текст по мере необходимости. Как мне сделать это в Улей?

Ответы [ 3 ]

0 голосов
/ 17 января 2020

С переменной:

set hivevar:n=3; --variable, you can pass it to the script

with your_table as(
select stack(2,"abc:def:ghi:jkl", "jkl:mno:23ar:stu:abc:def:ghi:7345")as data
)

select regexp_replace(regexp_extract(data,'([^:]*:){1,${hivevar:n}}',0),':$','') from your_table;

Результат:

OK
abc:def:ghi
jkl:mno:23ar
Time taken: 0.105 seconds, Fetched: 2 row(s)

Квантор {1,${hivevar:n}} после замены переменной станет {1,3}, что означает от 1 до 3 раз, это позволяет извлекать значения короче 3. Если вам не нужно извлекать более короткие значения, используйте квантификатор {${hivevar:n}}. Если элементов меньше N, в этом случае будет извлечена пустая строка.

0 голосов
/ 17 января 2020

Используя функции split и posexplode, вы можете снова комбинировать с позицией фильтрации

select t.dataId, concat_ws(":", collect_list(t.cell)) as firstN from (
SELECT x.dataId, pos as pos, cell
   FROM  (
     select 1 as dataId, "jkl:mno:23ar:stu:abc:def:ghi:7345" as data
      union all
     select 2 as dataId, "abc:def:ghi:7345" as data
   ) x 
   LATERAL VIEW posexplode(split(x.data,':')) dataTable AS pos, cell
) t
where t.pos<3
group by t.dataId
0 голосов
/ 17 января 2020
SELECT regexp_replace(`data`, '^([^:]+:[^:]+:[^:]+).*$', "$1")
FROM
  ( SELECT "abc:def:ghi:jkl" AS `data`
   UNION ALL SELECT "jkl:mno:23ar:stu:abc:def:ghi:7345" AS `data`) AS tmp
...