5. Парсинг входных данных с помощью регулярных выражений
Создаём новую таблицу.
USE smirnov_test;
DROP TABLE IF EXISTS SerDeExample;
CREATE EXTERNAL TABLE SerDeExample ( ip STRING )
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' # использование класса для работы с парсингом
WITH SERDEPROPERTIES ( "input.regex" = '^(\\S*)\\t.*$' )
STORED AS TEXTFILE
LOCATION '/data/user_logs/user_logs_M';
select * from SerDeExample limit 10;
Рисунок 18 – Создание таблицы, используя парсинг
Данное регулярное выражение описывает строку, где первая колонка содержит непустую последовательность символов, а вторая колонка игнорируется. Регулярное выражение "input.regex" = '^(\\S*)\\t.*$'
- '^' - начало строки
- '(\\S*)' - группа без пробелов (непустая последовательность символов), которая будет считываться в первой колонке
- '\\t' - символ табуляции, разделяющий первую и вторую колонки
- '.*' - любая последовательность символов
- '$' - конец строки
Получаем на выходе (рисунок 19):
Рисунок 19 – Вывод таблицы с парсингом
Изменяем регулярное выражение под две колонки:
USE smirnov_test;
DROP TABLE IF EXISTS SerDeExample;
CREATE EXTERNAL TABLE SerDeExample (ip STRING, data STRING )
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES ( "input.regex" = '^(\\S*)\\t\\t\\t(\\S*)\\t.*$' )
STORED AS TEXTFILE
LOCATION '/data/user_logs/user_logs_M';
select * from SerDeExample limit 10;
Рисунок 20 – Создание новой таблицы с новым парсингом
Рисунок 21 – Вывод таблицы с новым парсингом
Регулярное выражение будет соответствовать строке, содержащей две группы непробельных символов, разделенных тремя символами табуляции. Регулярное выражение "^(\\S*)\\t\\t\\t(\\S*)\\t.*$" разбивается на несколько частей:
- "^" - это начала строки, что означает, что соответствие должно начинаться с начала строки.
- "(\\S*)" - это группа, которая соответствует любой непробельной символ(не включая символ табуляции), и "*" означает, что группа может повторяться любое количество раз (включая ноль раз).
- "\\t\\t\\t" - это символьный класс, который соответствует трём последовательным символам табуляции.
- "(\\S*)" - аналогично первой группе, соответствует любой непробельной символ(не включая символ табуляции).
- "\\t.*" - это символьный класс, который соответствует символу табуляции, за которым следует любое количество любых символов.
- "$" - конца строки, что означает, что соответствие должно заканчиваться на конце строки.
Допишем рег. выражение. Добавим его в запрос и выполним, чтоб убедиться, что данные распарсились правильно. Следим за типами данных.
USE smirnov_test;
DROP TABLE IF EXISTS SerDeExample;
CREATE EXTERNAL TABLE SerDeExample ( ip STRING, data STRING, request STRING, responsecode STRING )
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES ( "input.regex" = '^(\\S*)\\t\\t\\t(\\S*)\\t(\\S*)\\t\\d+\\t(\\S*)\\t.*$' )
STORED AS TEXTFILE
LOCATION '/data/user_logs/user_logs_M';
select * from SerDeExample limit 10;
Рисунок 22 – Создание новой таблицы с дописанным рег. выражением
Рисунок 23 – Вывод новой таблицы с дописанным рег. выражением
Чтобы вывести несколько значений, используем конструкцию:
^ - Начало строки
(\\S*) - Группа 1: Любой не-пробельный символ, повторяющийся 0 или более раз
\\t\\t\\t - 3 символа табуляции
(\\S*) - Группа 2: Любой не-пробельный символ, повторяющийся 0 или более раз
\\t - Символ табуляции
(\\S*) - Группа 3: Любой не-пробельный символ, повторяющийся 0 или более раз
\\t - Символ табуляции
\\d+ - Один или более цифровых символов
\\t - Символ табуляции
(\\S*) - Группа 4: Любой не-пробельный символ, повторяющийся 0 или более раз
\\t.*$ - Символ табуляции, за которым идет любое количество символов и конец строки
Выводим информации про таблицу, используя команду: DESCRIBE SerDeExample (рисунок 24).
Рисунок 24 – Вывод информации о новой таблицы с дописанным рег. выражением
