Использование Apache Hive для создания Data WareHouse из текстовых файлов

Подготовим среду Hive для использования запросов и управления большими данными, находящихся в распределённых хранилищах.

 

Для создания таблицы в HDFS необходимо в командной строке прописать следующий код hadoop fs -mkdir /user/hive/warehouse/<имя директории>/.

Нам необходимо создать три файла и переместить их в файловое хранилище HDFS.

Создаем первый файл price

hadoop fs -mkdir /user/hive/warehouse/price/

hadoop fs -copyFromLocal /home/cloudera/Desktop/price

 

Создаем второй файл room

hadoop fs -mkdir /user/hive/warehouse/room/

hadoop fs -copyFromLocal /home/cloudera/Desktop/room

 

Создаем третий файл phone_number

hadoop fs -mkdir /user/hive/warehouse/phone_number /

hadoop fs -copyFromLocal /home/cloudera/Desktop/phone_number

 

Проверим работоспособность с помощью HUE и посмотрим файлы в папках.

 

Создадим таблицу price

DROP TABLE IF EXISTS price;

CREATE EXTERNAL TABLE PRICE (

area tinyint,

class tinyint,

price smallint

)

ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘|’

LOCATION ‘/user/cloudera/price/’;

 

Создадим таблицу room

DROP TABLE IF EXISTS room;

CREATE EXTERNAL TABLE ROOM (

level tinyint,

area tinyint,

class tinyint,

quantity smallint,

quantity_taken_room smallint

)

ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘|’

LOCATION ‘/user/cloudera/room/’;

 

Создадим таблицу phone_number

drop TABLE IF EXISTS PHONE_NUMBER;

CREATE EXTERNAL TABLE PHONE_NUMBER (

level tinyint,

phone_number int,

admin_name string

)

ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘|’

LOCATION ‘/user/cloudera/phone_number/’;

 

 

Сформируем простые запросы к базе данных

 

Запрос для вывода двухместных номеров

SELECT *

FROM price

WHERE area=2;

Запрос для вывода телефона, фамилии администратора первого этажа

SELECT phone_number, admin_name

FROM phone_number

WHERE level=1;

Запрос для вывода количества одноместных номеров первого класса по этажам.

SELECT level, quantity

FROM room

WHERE area = 1 and class = 1;

 

Запрос для вывода фамилий администраторов и номера телефонов этажей, на которых есть незанятые одноместные номера.

SELECT DISTINCT phone_number.admin_name, phone_number.phone_number

FROM phone_number INNER JOIN room ON phone_number.level = room.level

WHERE room.area = 1 And room.quantity > room.quantity_taken_room;

 

Запрос для вывода фамилий администраторов и номеров телефонов этажей, на которых есть больше девяти свободных двуместных номеров.

SELECT DISTINCT phone_number.admin_name, phone_number.phone_number

FROM phone_number INNER JOIN room ON phone_number.level = room.level

WHERE room.area = 2 And (room.quantity — room.quantity_taken_room) > 9;

SELECT area, class, Sum(quantity-quantity_taken_room) AS free_room

FROM room

GROUP BY area, class;

SELECT level, class, SUM(quantity) AS some_class_room

FROM room

WHERE class=1

GROUP BY level, class;

Запрос для вывода телефонов этажей, на которых расположены двуместные номера второго класса.

SELECT DISTINCT phone_number.level, phone_number.phone_number

FROM phone_number INNER JOIN room ON phone_number.level = room.level

WHERE area=2 AND class=2

Запрос для вывода телефонов этажей, на которых расположены трехместные номера второго класса или третьего класса.

SELECT DISTINCT phone_number.level, phone_number.phone_number

FROM phone_number INNER JOIN room ON phone_number.level = room.level

WHERE area=3 AND (class=2 OR class=3);