Извлечение названия книги из строки в улье

#regex #split #hive

#регулярное выражение #разделение #улей

Вопрос:

Мои данные выглядят примерно так —

 1124 An Orphan's Journey
234 Red Dragon
35600 You'll Know When It's Time
 

Он имеет два значения: первое — идентификатор книги, а второе — название книги.
Я использовал функцию разделения в Hive, но это выглядит неправильно.

 SELECT split(books, '\ ')[0] book_id,
split(books, '\ ')[1]    ' '   
split(books, '\ ')[2]    ' '   
split(books, '\ ')[3]   ' '   
split(books, '\ ')[4] as book_name
FROM books;
 

Пока значения хорошие, но я не считаю, что это правильный подход.
Пожалуйста, помогите.

Ответ №1:

Вы можете использовать

 REGEXP_EXTRACT(books, '^\d ', 0)
 

чтобы получить идентификатор книги и

 REGEXP_EXTRACT(books, '\s (\S.*)', 1)
 

чтобы извлечь название книги. Второе регулярное выражение может быть более подробным, скажем, вы также можете проверить, есть ли цифры в начале строки перед, '^\d \s (\S.*)' .

Здесь,

  • ^d — соответствует одной или нескольким цифрам () в начале строки ( ^ )
  • s (S.*) — сопоставляет один или несколько символов с пробелами ( s ), а затем записывает в группу 1 любой символ, не содержащий пробелов ( S ), а затем остальную часть строки ( .* сопоставляет любой ноль или более символов, отличных от символов разрыва строки, как можно больше). Обратите внимание, что во втором вызове аргументу index 1 присваивается значение o REGEXP_EXTRACT , чтобы убедиться, что возвращается только значение группы 1 без начальных пробелов.

Комментарии:

1. Я использовал « select REGEXP_EXTRACT(data, ‘^\ d ‘) из книг; « Сбой с исключением java.io.IOException:org.apache.hadoop.hive.ql.metadata. Исключение HiveException: невозможно выполнить общедоступный метод java.lang. Строковая org.apache.hadoop.hive.ql.udf.UDFRegExpExtract.evaluate(java.lang. Строка, java.lang. Строка) на объекте org.apache.hadoop.hive.ql.udf.UDFRegExpExtract@15a9caeb из класса org.apache.hadoop.hive.ql.udf.UDFRegExpExtract с аргументами {1124 Путешествие сироты: java.lang. Строка, ^d :java.lang. Строка} размера 2

2. @Onlydocs Попробуйте установить аргумент index равным 0 , REGEXP_EXTRACT(books, '^\d ', 0)

3. Добавлено 0, как указано. Он возвращает только номера книг. Мне нужно название книги. Итак, я попытался изменить индекс, но он возвращает мне ошибку ввода-вывода.

4. Извините, я не понял второго пункта, о котором вы упомянули. Это работает.. Спасибо ..!!