Введение
Представьте, что вы открыли записи заказов компании как электронную таблицу. Каждая строка описывает один заказ, каждый столбец — его свойство, например дату или статус оплаты. Вы хотите ответить на простой вопрос: какие оплаченные заказы команде следует проверить первыми? По мере роста файлов читать каждую строку вручную становится неудобно.
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-файл со своей внешней таблицей и узнаете, как связаны её метаданные и исходные файлы.



