#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
), а затем остальную часть строки (.*
сопоставляет любой ноль или более символов, отличных от символов разрыва строки, как можно больше). Обратите внимание, что во втором вызове аргументу index1
присваивается значение oREGEXP_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. Извините, я не понял второго пункта, о котором вы упомянули. Это работает.. Спасибо ..!!