使用正则表达式提取部分字符串的 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 查询的主要内容,如果未能解决你的问题,请参考以下文章

hive正则表达式

如何使用正则表达式提取部分字符串

Hive正则表达式

正则表达式 - 在最右边的斜杠出现处拆分字符串 [Hive]

Hive中常用正则表达式的运用

如何在 Hive 中使用正则表达式来提取第二个整数? [关闭]