使用正则表达式的Hive查询以提取字符串的部分

3
需要使用regexp_extract编写Hive查询以提取字段(类型为字符串)的一部分。

其中的值以冒号分隔。

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

需要在:之后提取值

>ID -> 10  
>Value -> 8  
>Name -> 7 

尝试使用regexp_extract,但无法得到输出。

请使用regexp_extract分享您的尝试。 - Digvijay S
@DigvijayS 我可以提取括号内的值,regexp_extract("ID(1001):10|Value(1002):8|Name(xyz):7"," Value\(([^)]+)\",1) 作为后续操作。 - Ishrath Rehana
2个回答

1

去掉括号中的字符串,转换为映射,使用map ['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

0
如果你能使用 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     |
+-----+--------+-------+--+


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接