使用正则表达式提取部分字符串的 Hive 查询
Posted
技术标签:
【中文标题】使用正则表达式提取部分字符串的 Hive 查询【英文标题】:Hive query to extract part of the string using regexp 【发布时间】:2020-04-07 06:08:24 【问题描述】:需要Hive
使用regexp_extract
查询以提取字段的一部分(字符串类型)。
其中的值以冒号分隔
Field String:
ID(1001):10|Value(1002):8|Name(xyz):7
需要提取:
之后的值
>ID -> 10
>Value -> 8
>Name -> 7
尝试使用regexp_extract
,但无法获得输出。
【问题讨论】:
请使用regexp_extract
分享您的尝试
@DigvijayS 我可以提取括号内的值 ,regexp_extract("ID(1001):10|Value(1002):8|Name(xyz):7","Value\( ([^)]+)\\",1) as after1
【参考方案1】:
去掉括号内的字符串,转换成map,使用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
【讨论】:
【参考方案2】:如果你可以使用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 |
+-----+--------+-------+--+
【讨论】:
以上是关于使用正则表达式提取部分字符串的 Hive 查询的主要内容,如果未能解决你的问题,请参考以下文章