Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 3.docx
Скачиваний:
22
Добавлен:
12.02.2024
Размер:
7.97 Mб
Скачать

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– Вывод информации о новой таблицы с дописанным рег. выражением