蜂巢 - 正则表达式错误的参数



我需要在 url 模式中捕获文本"lnk="之后的字符串,但正则表达式抛出错误。

select regexp_extract('www.mysite.com?lnk=snav_rd_clothing&param=homepage', '(?<=(lnk=))(.*?)(?=&|?|$)') from table1 limit 10;
FAILED: SemanticException [Error 10014]: Line 1:7 Wrong arguments ''(?<=(lnk=))(.*?)(?=&|?|$)'': org.apache.hadoop.hive.ql.metadata.HiveException: Unable to execute method public java.lang.String org.apache.hadoop.hive.ql.udf.UDFRegExpExtract.evaluate(java.lang.String,java.lang.String)  on object org.apache.hadoop.hive.ql.udf.UDFRegExpExtract@65c86db8 of class org.apache.hadoop.hive.ql.udf.UDFRegExpExtract with arguments {www.mysite.com?lnk=snav_rd_clothing&param=homepage:java.lang.String, (?<=(lnk=))(.*?)(?=&|?|$):java.lang.String} of size 2

错误的原因是您使用单个反斜杠转义了?&。由于 hive 中的字符串文本支持转义序列,因此需要双反斜杠才能将文本反斜杠传递给正则表达式引擎。

但是,您的模式对于当前任务来说过于复杂,即获取 0+ 字符,而不是 & 个字符,并在 lnk= 之后? 个字符。

您可以仅在此处依赖捕获组和否定字符类:

regexp_extract(str, '[?&]lnk=([^&?]*)', 1)

其中1表示第一个(也是这里唯一的(捕获组。

详情

  • [?&] - ?&(将lnk匹配为查询参数名称(
  • lnk= - a literal substring lnk='
  • ([^&?]*) - 组 1:除 &? 以外的零个或多个字符([^...]是一个否定字符类,与集合/范围中定义的字符以外的任何字符匹配(

最新更新