如何在蜂巢中使用regexp_extract

时间:2019-03-04 17:21:04

标签: regex hive hiveql

我正在尝试使用regexp_extract提取以下字符串的一部分,但没有成功:

  

CUST_NEW_ACCOUNTS_LINES_2019-03-03.dat.gz

我只想获取日期部分。在regex101.com网站上,这似乎可行,但是蜂巢给我一个错误消息。

regexp_extract(meta_source_filename,'^(?:[^_]+_){4}([^_]+)') file_date

有人可以帮助我了解这里的错误之处吗?我对regexp_extract语法一点都不熟悉,因此一直在使用另一个函数作为起点。
谢谢!

2 个答案:

答案 0 :(得分:1)

with your_data as (
select 'CUST_NEW_ACCOUNTS_LINES_2019-03-03.dat.gz' str
)

select regexp_extract(str,'_(\\d{4}(-\\d{2}){2})\\.',1)
from your_data;

结果:

OK
2019-03-03
Time taken: 0.062 seconds, Fetched: 1 row(s)

表达式'_(\\d{4}(-\\d{2}){2})\\.'的意思是:

下划线_四位数\\d{4}重复两次(连字符和两位数)(-\\d{2}){2}\\.

捕获组编号1(仅日期):(\\d{4}(-\\d{2}){2})。 在Hive中,您需要使用\\进行屏蔽。

答案 1 :(得分:0)

您已将所需的子字符串捕获到捕获组中。您应该使用数字,组的ID作为第三个参数:

regexp_extract(meta_source_filename,'^(?:[^_]+_){4}([^_]+)', 1) file_date
                                                             ^

请参阅regexp_extract(string subject, string pattern, int index)文档:

  

'index'参数是Java regex Matcher group()方法的索引。有关'index'或Java regex group()方法的更多信息,请参见docs/api/java/util/regex/Matcher.html