4. Партиционирование
Создадим партиционированную таблицу из таблицы Subnets. Информация о каждой партиции хранится в отдельной HDFS-директории внутри metastore.
SET hive. exec. dynamic. partition. Mode=nonstrict;
USE stanishevskii_test;
DROP TABLE IF EXISTS SubnetsPart;
CREATE EXTERNAL TABLE SubnetsPart (ip STRING)
PARTITIONED BY (mask STRING)
STORED AS TEXTFILE;
INSERT OVERWRITE TABLE SubnetsPart PARTITION (mask)
SELECT * FROM Subnets;
Рисунок 10 – Запуск команд для создания партиционированной таблицы
Уже здесь вы можете увидеть, что запрос транслируется в MapReduce-задачу. Чтобы убедиться в этом, можно зайти на ApplicationMaster UI.
Рисунок 11 – Запуск команд для создания партиционированной таблицы
Рисунок 12 – Вывод команд для создания партиционированной таблицы
Рисунок 13 – Вывод команд для создания партиционированной таблицы
Проверим получившиеся партиции через команду: SHOW PARTITIONS SubnetsPart.
Рисунок 14 – Запуск команд для проверки получившихся партиций
С помощью команды: Describe formatted SubnetsPart
Можно получить полную информацию о свойствах таблицы. Выведем информацию о таблице SubnetsPart.
Рисунок 15 – Запуск команды Describe formatted
Опишем смысл полей из col_name:
Col name - информация о столбце ip (string)
Partition Information - информация о партициях таблицы. Этот раздел указывает, что у таблицы есть партиции, и в данном случае, колонка mask используется для партиционирования. Таким образом, данные будут разделены по значениям в колонке mask.
Detailed Table Information - общая информация о таблице. Здесь представлена информация об общей информации о таблице: создание таблицы, владельце таблицы, время последнего доступа, расположение таблицы, параметры хранения данных и другие свойства.
Storage Information - информация о способах хранения данных. Здесь представлена информация о хранении данных, такую как библиотека сериализации/десериализации (Serge), формат ввода и вывода, параметры сжатия и параметры хранения данных.
5. Парсинг входных данных с помощью регулярных выражений
Создаём новую таблицу.
USE stanishevskii_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;
Рисунок 16 – Создание таблицы, используя парсинг
Данное регулярное выражение описывает строку, где первая колонка содержит непустую последовательность символов, а вторая колонка игнорируется. Регулярное выражение "input.regex" = '^(\\S*)\\t.*$'
- '^' - начало строки
- '(\\S*)' - группа без пробелов (непустая последовательность символов), которая будет считываться в первой колонке
- '\\t' - символ табуляции, разделяющий первую и вторую колонки
- '.*' - любая последовательность символов
- '$' - конец строки
Получаем на выходе:
Рисунок 17 – Вывод таблицы с парсингом
Изменяем регулярное выражение под две колонки:
USE stanishevslii_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;
Рисунок 18– Создание новой таблицы с новым парсингом
Рисунок 19 – Вывод таблицы с новым парсингом
Регулярное выражение будет соответствовать строке, содержащей две группы непробельных символов, разделенных трёми символами табуляции. Регулярное выражение "^(\\S*)\\t\\t\\t(\\S*)\\t.*$" разбивается на несколько частей:
- "^" - это начала строки, что означает, что соответствие должно начинаться с начала строки.
- "(\\S*)" - это группа, которая соответствует любой непробельной символ(не включая символ табуляции), и "*" означает, что группа может повторяться любое количество раз (включая ноль раз).
- "\\t\\t\\t" - это символьный класс, который соответствует трём последовательным символам табуляции.
- "(\\S*)" - аналогично первой группе, соответствует любой непробельной символ(не включая символ табуляции).
- "\\t.*" - это символьный класс, который соответствует символу табуляции, за которым следует любое количество любых символов.
- "$" - конца строки, что означает, что соответствие должно заканчиваться на конце строки.
Допишем рег. выражение. Добавим его в запрос и выполним, чтоб убедиться, что данные распарсились правильно. Следите за типами данных.
USE stanishevskii_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;
Рисунок 20– Создание новой таблицы с дописанным рег. выражением
Рисунок 21– Вывод новой таблицы с дописанным рег. выражением
Чтобы вывести несколько значений, используя конструкции Like [-]
^ - Начало строки
(\\S*) - Группа 1: Любой не-пробельный символ, повторяющийся 0 или более раз
\\t\\t\\t - 3 символа табуляции
(\\S*) - Группа 2: Любой не-пробельный символ, повторяющийся 0 или более раз
\\t - Символ табуляции
(\\S*) - Группа 3: Любой не-пробельный символ, повторяющийся 0 или более раз
\\t - Символ табуляции
\\d+ - Один или более цифровых символов
\\t - Символ табуляции
(\\S*) - Группа 4: Любой не-пробельный символ, повторяющийся 0 или более раз
\\t.*$ - Символ табуляции, за которым идет любое количество символов и конец строки
Выводим информации про таблицу, используя команду: DESCRIBE SerDeExample
Рисунок 22– Вывод информации о новой таблицы с дописанным рег. выражением