我正在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)
返回错误
提取的值将用于连接到另一列,因此结果需要返回一个值,而不是数组。
答案 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()
。