首页 > 解决方案 > 如何在第 n 个出现配置单元之前进行 regexp_extract

问题描述

我有这样的字符串:

LLC1R.8888.GR0054656*DR.798012...2..............GR0054656*EUR*

我已经用这个进行了提取: REGEXP_EXTRACT(b.COLUMN_YY,'^([^\.]+)\.?',2)

但它发生错误2:mapredtask

    at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:157)
Caused by: 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,java.lang.Integer)  on object org.apache.hadoop.hive.ql.udf.UDFRegExpExtract@5875de6a of class org.apache.hadoop.hive.ql.udf.UDFRegExpExtract with arguments :java.lang.String, ^([^.]+).?:java.lang.String, 2:java.lang.Integer} of size 3
    at org.apache.hadoop.hive.ql.exec.FunctionRegistry.invoke(FunctionRegistry.java:1024)
    at org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge.evaluate(GenericUDFBridge.java:194)
    at org.apache.hadoop.hive.ql.exec.ExprNodeGenericFuncEvaluator._evaluate(ExprNodeGenericFuncEvaluator.java:186)
    at org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator.evaluate(ExprNodeEvaluator.java:77)
Caused by: java.lang.reflect.InvocationTargetException
Caused by: java.lang.IndexOutOfBoundsException: No group 2

出了什么问题,应该如何解决?

任何帮助/想法将不胜感激。谢谢你。

标签: regexhivehiveql

解决方案


从错误堆栈跟踪中很清楚出了什么问题:“ Caused by: java.lang.IndexOutOfBoundsException: No group 2

REGEXP_EXTRACT参考

返回使用模式提取的字符串。例如,regexp_extract('foothebar', 'foo(.*?)(bar)', 2)返回'bar.'注意在使用预定义的字符类时需要注意:使用'\s'作为第二个参数将匹配字母s'\\s'是匹配空格等所必需的。'index'参数是Java regex Matcher group()方法索引。有关“索引”或 Java 正则表达式方法的更多信息,请参阅docs/api/java/util/regex/Matcher.htmlgroup()

因此,要获取之前的第一个子字符串.,您应该使用

REGEXP_EXTRACT(b.COLUMN_YY, '^([^.]*)', 1)

要获取 之间的第二个字符串.,请使用

REGEXP_EXTRACT(b.COLUMN_YY, '^[^.]*\\.([^.]*)', 1)

要获取 之间的第 n 个字符串.,请使用(?:[^.]*\.){n-1}. 因此,要获得第三个,请使用

REGEXP_EXTRACT(b.COLUMN_YY, '^(?:[^.]*\\.){2}([^.]*)', 1)

请注意,1 index参数会REGEXP_EXTRACT返回组 1 中捕获的值,请参阅下面的模式详细信息:

  • ^- 字符串的开始
  • (?:[^.]*\.){2}- 这里,出现了两次
    • [^.]* - 0 个或更多字符.
    • \. - 一个.字符
  • ([^.]*)-第 1 组:除 . 之外的任何 0 个或多个字符.

推荐阅读