如何在第 n 次出现配置单元之前进行 regexp_extract
Posted
技术标签:
【中文标题】如何在第 n 次出现配置单元之前进行 regexp_extract【英文标题】:how to regexp_extract before nth occurance hive 【发布时间】:2020-11-21 11:33:55 【问题描述】:我有这样的字符串:
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
出了什么问题以及应该如何解决?
任何帮助/想法将不胜感激。谢谢。
【问题讨论】:
【参考方案1】:从错误堆栈跟踪中很清楚出了什么问题:“Caused by: java.lang.IndexOutOfBoundsException: No group 2”
见REGEXP_EXTRACT
reference:
返回使用模式提取的字符串。例如,
regexp_extract('foothebar', 'foo(.*?)(bar)', 2)
返回'bar.'
请注意,在使用预定义的字符类时需要注意:使用'\s'
作为第二个参数将匹配字母s
;'\\s'
是匹配空格等所必需的。'index'
参数是 Java 正则表达式 Matchergroup()
方法索引。有关“索引”或 Java 正则表达式group()
方法的更多信息,请参阅 docs/api/java/util/regex/Matcher.html。
因此,要获取.
之前的第一个子字符串,您应该使用
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 个或多个字符。
【讨论】:
以上是关于如何在第 n 次出现配置单元之前进行 regexp_extract的主要内容,如果未能解决你的问题,请参考以下文章