4. Партиционирование
Создадим партиционированную таблицу из таблицы Subnets. Информация о каждой партиции хранится в отдельной HDFS-директории внутри metastore.
SET hive.exec.dynamic.partition.mode=nonstrict;
USE mazhukin_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;
Рисунки 11 - 14 – Запуск команд для создания партиционированной таблицы
Уже здесь вы можете увидеть, что запрос транслируется в MapReduce-задачу. Чтобы убедиться в этом, можно зайти на ApplicationMaster UI.
Рисунок 15 – Запуск команд для создания партиционированной таблицы
Рисунок 16 – Вывод команд для создания партиционированной таблицы
Рисунок 17 – Вывод команд для создания партиционированной таблицы
Проверим получившиеся партиции через команду: SHOW PARTITIONS SubnetsPart.
Рисунок 18 – Запуск команд для проверки получившихся партиций
С помощью команды: Describe formatted <Имя таблицы>
Можно получить полную информацию о свойствах таблицы. Выведем информацию о таблице SubnetsPart.
Рисунок 19 – Запуск команды Describe formatted
Опишем смысл полей из col_name:
Col name - информация о столбце ip, тип строка (string)
Partition Information - данные о партициях таблицы указывают на наличие разделения данных по значениям в колонке mask.
Detailed Table Information - в данном разделе представлена общая информация о таблице, включая информацию о её создании, владельце, последнем доступе, расположении, параметрах хранения данных и других свойствах.
Storage Information - в данном разделе представлена информация о различных методах, которые используются для хранения данных. Здесь находится информация о библиотеке сериализации/десериализации Serge, форматах ввода и вывода, параметрах сжатия и способах хранения данных.
5. Парсинг входных данных с помощью регулярных выражений
Создаём новую таблицу.
USE mazhukin_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;
Рисунок 20 – Создание таблицы, используя парсинг
Получаем на выходе:
Рисунок 21 – Вывод таблицы с парсингом
Изменяем регулярное выражение. Для этого я создал sql файл со следующим содержимым:
USE mazhukin_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;
Рисунок 22 – Создание новой таблицы с новым парсингом и вывод таблицы
Допишем регулярное выражение. Добавим его в запрос и выполним, чтоб убедиться, что данные распарсились правильно. Следим за типами данных. Для этого я создал sql файл со следующим содержимым:
USE mazhukin_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;
Рисунок 23 – Создание новой таблицы с дописанным регулярным выражением и вывод новой таблицы
Выводим информации про таблицу, используя команду: DESCRIBE SerDeExample
Рисунок 24– Вывод информации о новой таблицы с дописанным регулярным выражением
