как выполнить regexp_extract до n-го события улья

#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 ссылку:

Возвращает строку, извлеченную с использованием шаблона. Например, regexp_extract('foothebar', 'foo(.*?)(bar)', 2) возвращает 'bar.' примечание о том, что при использовании предопределенных классов символов необходима некоторая осторожность: использование 's' в качестве второго аргумента будет соответствовать букве s ; '\s' необходимо сопоставить пробелы и т.д. 'index' Параметр является индексом метода сопоставления group() регулярных выражений Java. См. docs/api/java/util/regex/Matcher.html для получения дополнительной информации о методе «index» или Java regex group() .

Итак, чтобы получить первую подстроку раньше . , вы должны использовать

 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 или более символов, отличных от . .