Запрос Hive для извлечения части строки с помощью регулярных выражений - PullRequest
1 голос
/ 07 апреля 2020

Требуется Hive Query с использованием regexp_extract для извлечения части поля (типа String). Значение в нем разделено двоеточием

Field String: 
ID(1001):10|Value(1002):8|Name(xyz):7

Необходимо извлечь значение после :

ID -> 10
Значение -> 8
Имя -> 7

Попытка с использованием regexp_extract и не может получить вывод.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

если бы вы могли использовать функцию SPLIT, это было бы очень легко. Как пример:

SELECT split(split(t.col, '\\|')[0],'\\:')[1] AS ID,
       split(split(t.col, '\\|')[1], '\\:')[1] AS Value,
       split(split(t.col, '\\|')[2], '\\:')[1] AS Name
FROM (SELECT 'ID(1001):10|Value(1002):8|Name(xyz):7' AS col) t;
+-----+--------+-------+--+
| id  | value  | name  |
+-----+--------+-------+--+
| 10  | 8      | 7     |
+-----+--------+-------+--+

С уважением.

0 голосов
/ 07 апреля 2020

Удалить строки в скобках, преобразовать в карту и использовать карту ['key'], чтобы получить поля:

select m['ID'] as id, m['Value'] as value, m['Name'] as Name 
  from (select str_to_map(regexp_replace('ID(1001):10|Value(1002):8|Name(xyz):7','\\(.*?\\)',''),'\\|',':') as m
       )s;

Результат:

id      value   name
10      8       7

Использование только регулярных выражений:

SELECT regexp_extract(t.col,'(?i)ID.*?:(\\d+)\\|',1)    as ID,
       regexp_extract(t.col,'(?i)Value.*?:(.?+)\\|',1)  as Value,
       regexp_extract(t.col,'(?i)Name.*?:(.?+)\\|*',1)  as Name
FROM (SELECT 'ID(1001):10|Value(1002):8|Name(xyz):7' AS col) t;

Результат:

id      value   name
10      8       7
...