#regex #hive #hiveql
#регулярное выражение #улей #hiveql
Вопрос:
У меня есть строка, подобная этой:
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:
Из трассировки стека ошибок становится ясно, что пошло не так: «Вызвано: java.lang.Исключение IndexOutOfBoundsException: нет группы 2»
Возвращает строку, извлеченную с использованием шаблона. Например,
regexp_extract('foothebar', 'foo(.*?)(bar)', 2)
возвращает'bar.'
примечание о том, что при использовании предопределенных классов символов необходима некоторая осторожность: использование's'
в качестве второго аргумента будет соответствовать буквеs
;'\s'
необходимо сопоставить пробелы и т.д.'index'
Параметр является индексом метода сопоставленияgroup()
регулярных выражений Java. См. docs/api/java/util/regex/Matcher.html для получения дополнительной информации о методе «index» или Java regexgroup()
.
Итак, чтобы получить первую подстроку раньше .
, вы должны использовать
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 или более символов, отличных от.
.