Подготовим среду 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 и посмотрим файлы в папках.
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);