Ваш первый запрос Hive

Биг датаBeginner
Практиковаться сейчас

Введение

Представьте, что вы открыли записи заказов компании как электронную таблицу. Каждая строка описывает один заказ, каждый столбец — его свойство, например дату или статус оплаты. Вы хотите ответить на простой вопрос: какие оплаченные заказы команде следует проверить первыми? По мере роста файлов читать каждую строку вручную становится неудобно.

Apache Hive позволяет описывать файловые данные как таблицы и задавать вопросы с помощью SQL, языка структурированных запросов. Определение таблицы описывает столбцы и расположение исходных файлов; сами файлы содержат записи. Hive использует определение для интерпретации данных и выполнения запроса. В этой подготовленной среде HDFS обеспечивает хранение, а Hive — слой таблиц и запросов. Одна лишь загрузка файла не превращает его автоматически в таблицу Hive.

Hive полезен для аналитических запросов к сохранённым данным, например пакетных отчётов. Это не то же самое, что редактирование ячеек электронной таблицы, и курс не представляет его заменой транзакционной базы данных любого приложения. Здесь вы начнёте с шести понятных записей, чтобы предположить правильный ответ до работы с большими объёмами.

Вы будете использовать Beeline, терминальный клиент Hive, для подключения к работающей службе HiveServer2. Служба и пример таблицы подготовлены для вас. Не нужно устанавливать программы, инициализировать метаданные или заранее знать Java, Python, Hadoop или SQL. Достаточно базового использования терминала и умения читать таблицу. Для дополнительной практики терминала и баз данных обратитесь к путям Linux и Database.

Ваш путь обучения: увидеть реальные строки, изучить структуру таблицы, сохранить запрос выбора оплаченных заказов и изменить одно условие для проверки понимания.

Посмотрите первые строки Hive

На этом шаге вы подключитесь к Hive и прочитаете подготовленную таблицу перед изучением ограничения запроса.

Используйте вкладку Terminal. Перейдите в локальный каталог проекта с помощью cd:

cd /home/labex/project

Beeline — клиент: он отправляет SQL в HiveServer2, который обрабатывает запрос. В команде ниже -u задаёт URL подключения, -n — имя пользователя сеанса, а -e — SQL для выполнения перед выходом обратно в терминал. Предоставленный URL подключается к службе Hive этой машины на порту 10000, первоначально в базе default. Для этой учебной службы внешняя учётная запись и пароль не нужны.

SQL SELECT * FROM retail_intro.orders; запрашивает все столбцы (*) таблицы orders в базе retail_intro. Точка с запятой завершает оператор. Одинарные кавычки сохраняют весь SQL-оператор одним аргументом оболочки:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'SELECT * FROM retail_intro.orders;'

Найдите шесть строк заказов и имена столбцов, например order_id, quantity и order_status. Вокруг результатов могут появиться сообщения подключения и границы таблицы. Найдите заказ o1: количество 2, цена единицы 10.00, статус paid. У заказа o3 статус pending, у o5 — refunded. Каждая строка — один упрощённый заказ с одним видом товара.

Запрос получает данные; этот SELECT не меняет статус оплаты и не обновляет исходный файл. Без условия упорядочивания не предполагайте, что SQL гарантирует определённый порядок строк.

Сохраните вывод того же запроса в локальный протокол. Оператор оболочки > создаёт файл или заменяет его прежнее содержимое:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'SELECT * FROM retail_intro.orders;' > /home/labex/project/output/first-look.txt

Прочитайте его локально:

cat /home/labex/project/output/first-look.txt

Строки заказов должны по-прежнему присутствовать. Терминал запустил клиент Beeline, Hive прочитал определение таблицы и файлы, а оболочка сохранила показанный результат локально. Далее вы изучите объекты, стоящие за запросом.

Изучите базу данных, таблицу и столбцы

На этом шаге вы изучите базу данных и определение таблицы вместо угадывания имён столбцов.

База данных — пространство имён, объединяющее таблицы. SHOW DATABASES перечисляет доступные базы данных; команда не читает все их файлы данных:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'SHOW DATABASES;'

Найдите default и retail_intro. Используйте USE для выбора базы, затем SHOW TABLES в том же вызове:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'USE retail_intro; SHOW TABLES;'

Вы должны найти orders. Каждая команда -e открывает новый сеанс Beeline, поэтому USE одного вызова не переносится незаметно в следующий. Выбирайте базу в каждом SQL-файле или используйте полное имя retail_intro.orders.

DESCRIBE перечисляет столбцы таблицы и их типы. Например, STRING хранит текст, INT — целые числа, DECIMAL(10,2) — числа с фиксированной точкой и двумя десятичными знаками, а DATE представляет календарную дату:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'DESCRIBE retail_intro.orders;'

Сопоставьте поля со строками первого запроса. Количество и цена имеют разный смысл и типы, хотя оба выглядят числовыми. В одной из последующих работ вы будете вычислять денежные значения; сегодня вы только читаете предоставленные поля.

Для сохранения результатов Beeline может использовать простой текстовый формат. --outputformat=tsv2 выбирает поля с разделителем табуляции, --showHeader=false убирает строку заголовка, а --silent=true сокращает сообщения клиента. Сохраните описание схемы с этими параметрами вывода:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e 'DESCRIBE retail_intro.orders;' > /home/labex/project/output/table-schema.txt

Протокол может содержать и сообщения выполнения. Важные строки схемы называют все семь столбцов и их типы. Определение таблицы — метаданные: оно сообщает Hive, как интерпретировать сохранённые файлы. Следующая работа покажет, как создать это сопоставление самостоятельно.

Сохраните запрос первых оплаченных заказов

На этом шаге вы выберете только нужные команде проверки столбцы и оплаченные строки с предсказуемым порядком результата.

Запрос может ограничивать данные несколькими независимыми способами:

Часть запроса Назначение здесь
SELECT Выбрать выходные столбцы
FROM Выбрать исходную таблицу
WHERE Сохранить строки, для которых условие истинно
ORDER BY Явно отсортировать результат
LIMIT Вернуть не больше запрошенного числа строк

Вы запросите order_id, order_status и quantity, оставите только строки paid, отсортируете по ID заказа и вернёте первые две. Предположите, какие строки останутся: среди шести заказов первые оплаченные ID в таком порядке — o1 и o2.

Сохраните SQL в локальном файле, чтобы его можно было изучить и выполнить снова. В следующей команде оболочки cat > file <<'SQL' начинает here-документ: строки до закрывающего SQL буквально записываются в файл. Это SQL-текст, а не команды оболочки. Скопируйте весь блок, включая строки разделителей:

cat > /home/labex/project/queries/first-query.sql <<'SQL'
USE retail_intro;
SELECT order_id, order_status, quantity
FROM orders
WHERE order_status = 'paid'
ORDER BY order_id
LIMIT 2;
SQL

'paid' в кавычках внутри SQL — текстовое значение. = сравнивает статус каждой строки с этим значением, а не назначает новый статус. Оператор USE делает файл независимым от предыдущего сеанса клиента.

Параметр Beeline -f читает локальный SQL-файл. Выполните свой файл и сохраните его вывод с только что изученными параметрами текстового формата:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/first-query.sql > /home/labex/project/output/first-query.txt

Прочитайте сохранённый протокол:

cat /home/labex/project/output/first-query.txt

Строки результата должны быть такими:

o1 paid 2
o2 paid 1

Окружающие сообщения выполнения не являются записями заказов. LIMIT 2 не означал две произвольные строки: явная сортировка определила, какие подходящие строки идут первыми. Теперь у вас есть повторно используемый файл запроса и наблюдаемый ответ на вопрос команды.

Предположите эффект изменения одного условия

На этом шаге вы измените только условие статуса и проверите, совпадают ли возвращённые строки с вашим предположением.

Оставьте запрос оплаченных заказов нетронутым. В той же таблице есть заказ pending: o3 с количеством 1. Если изменить условие статуса с paid на pending, сколько строк должен вернуть лимит два? Лимит — максимум, поэтому ответ: одну.

Запишите тот же запрос, изменив только это условие:

cat > /home/labex/project/queries/pending-query.sql <<'SQL'
USE retail_intro;
SELECT order_id, order_status, quantity
FROM orders
WHERE order_status = 'pending'
ORDER BY order_id
LIMIT 2;
SQL

Выполните его независимо:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/pending-query.sql > /home/labex/project/output/pending-query.txt

Прочитайте сохранённый результат:

cat /home/labex/project/output/pending-query.txt

Единственная строка заказа должна быть такой:

o3 pending 1

Изменение фильтра выбрало другую строку, не меняя сохранённые записи таблицы. Теперь вы использовали одну базовую структуру запроса для двух вопросов. Далее вы свяжете существующий CSV-файл с определением таблицы вместо использования подготовленной таблицы.

Итоги

Вы определили место Hive в процессе «файл — таблица — запрос», подключились через Beeline и изучили базу данных, таблицу и схему. Вы написали повторно используемый SQL-файл с выбором столбцов, фильтрацией, явной сортировкой и ограничением строк, затем предположили и проверили изменение одного условия.

Для этого первого знакомства таблица была подготовлена заранее. В следующей работе вы сопоставите CSV-файл со своей внешней таблицей и узнаете, как связаны её метаданные и исходные файлы.