hive查询

wwtsj6pe  于 2021-05-31  发布在  Hadoop
关注(0)|答案(2)|浏览(426)

需要 Hive 查询使用 regexp_extract 提取字段的一部分(键入string)。
其中的值以冒号分隔

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

需要提取后的值 : ```

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

尝试使用 `regexp_extract` 无法获取输出。
6pp0gazn

6pp0gazn1#

如果你能用 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     |
+-----+--------+-------+--+
2skhul33

2skhul332#

删除括号中的字符串,转换为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

仅使用regexp:

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

相关问题