如何在第n个Hive出现前提取regexp\u

njthzxwz  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(390)

我有这样的线:

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

出了什么问题,应该如何修复?
任何帮助/想法都将不胜感激。谢谢您。

lyr7nygr

lyr7nygr1#

很明显,错误堆栈跟踪中出现了什么错误:“caused by:java.lang.indexoutofboundsexception:no group 2”
看到了吗 REGEXP_EXTRACT 参考文献:
返回使用模式提取的字符串。例如, regexp_extract('foothebar', 'foo(.*?)(bar)', 2) 退货 'bar.' 请注意,在使用预定义字符类时需要注意:使用 '\s' 因为第二个参数与字母匹配 s ; '\\s' 必须匹配空格等 'index' 参数是java正则表达式匹配器 group() 方法索引。有关“index”或java regex的更多信息,请参见docs/api/java/util/regex/matcher.html group() 方法。
所以,要在 . ,您应该使用

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

得到第二根弦 . ,使用

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

得到第n个字符串 . ,使用 (?:[^.]*\.){n-1} . 所以,要得到第三个,使用

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

请注意 1 索引参数使 REGEXP_EXTRACT 返回在组1中捕获的值,请参见下面的模式详细信息: ^ -字符串开头 (?:[^.]*\.){2} -这里有两次 [^.]* -0个或多个字符,而不是
. \. -a . 烧焦 ([^.]*) -组1:任何0个或更多字符 . .

相关问题