配置单元REGEXP_EXTRACT提取模式的第二次出现

时间:2018-07-10 18:14:52

标签: regex hive

我正在Hive中查询数据并从列中提取代码。我最近发现,由于数据输入/业务流程问题,用户一直在超负荷使用字段,并在应只输入一个作业代码时输入两个单独的作业代码。

从列中采样数据:

NOV2 WAA UW FOO DISPLAY_W2100008/ SOMETHING DISPLAY W2100106

我一直在使用REGEXP_EXTRACT(column,'([A-Z]\\d{7})',1) as id将正确提取第一个代码W2100008,但是我无法提取第二个代码W21001061

我想使用REGEXP_EXTRACT两次,别名为id_1和id_2,因此我们可以分析引用的第二个代码。有没有办法在第二次匹配模式时进行引用?

REGEXP_EXTRACT(column,'_([A-Z]\\d{7})',0)返回第一个匹配项

REGEXP_EXTRACT(column,'([A-Z]\\d{7})',1)返回第一个匹配项

REGEXP_EXTRACT(column,'([A-Z]\\d{7})',2)返回错误

提取的值将用于连接到另一列,因此结果需要返回一个值,而不是数组。

1 个答案:

答案 0 :(得分:1)

将所有'.*?([A-Z]\\d{7})'替换为delimiter(space) + ([A-Z]\\d{7})。使用trim删除第一个空格,除以' '以得到数组:

hive> select split(trim(regexp_replace('NOV2 WAA UW FOO DISPLAY_W2100008/SOMETHING DISPLAY W2100106','.*?([A-Z]\\d{7})',' $1')),' ');
OK
["W2100008","W2100106"]

获取第一个元素:

hive> select split(trim(regexp_replace('NOV2 WAA UW FOO DISPLAY_W2100008/ SOMETHING DISPLAY W2100106','.*?([A-Z]\\d{7})',' $1')),' ')[0];
OK
W2100008
Time taken: 0.065 seconds, Fetched: 1 row(s)

第二个元素是

split(trim(regexp_replace('NOV2 WAA UW FOO DISPLAY_W2100008/ SOMETHING DISPLAY W2100106','.*?([A-Z]\\d{7})',' $1')),' ')[1]

最好使用子查询一次解析数组。

select display_array[0] as id_1 , display_array[1] as id_2
from
(
select split(trim(regexp_replace('NOV2 WAA UW FOO DISPLAY_W2100008/ SOMETHING DISPLAY W2100106','.*?([A-Z]\\d{7})',' $1')),' ') as display_array
)s;

如果要每行每个元素,请使用explode()