Введение
Компания получает новый файл каждый день. Прежние отчёты фильтровали записи по дате внутри каждой строки. Таблица с разделами также отражает организацию по датам в метаданных, поэтому запрос может выбирать зарегистрированные расположения данных, связанные с нужной датой.
Должны совпадать две вещи: файлы в HDFS и записи разделов в Metastore Hive — каталоге, хранящем определения таблиц и разделов. Создание каталога само по себе не регистрирует раздел Hive. Вы увидите это непосредственно, добавив файлы за новый день до их регистрации.
Для работы независимо подготовлены файлы за два дня и локальная порция за третий. Вы создадите внешнюю таблицу с разделами, зарегистрируете расположения, прочитаете столбец раздела и изучите план запроса с фильтром. Hive готов; установка и состояние предыдущей VM не нужны. Достаточно знакомства с внешними таблицами и простыми фильтрами дат. Используйте терминал.
Отделите столбцы файла от столбца раздела
На этом шаге вы определите таблицу с разделами по датам, не повторяя дату внутри каждой записи. Изучите подготовленный файл:
cd /home/labex/project
cat /home/labex/project/data/orders-2026-10-14.csv
В файле шесть столбцов. В отличие от прежнего CSV с семью столбцами, здесь нет поля order_date: один файл содержит заказы только одной даты. Проверьте уже подготовленные ежедневные каталоги HDFS:
hdfs dfs -ls /user/labex/hive-partitions/orders
Имя вроде order_date=2026-10-14 делает организацию понятной людям. Для использования в Hive всё равно нужны зарегистрированные значение раздела и расположение.
Следующая таблица объявляет шесть полей файла обычным образом и отдельно объявляет order_date DATE в PARTITIONED BY. Hive предоставит этот седьмой доступный для запроса столбец из метаданных разделов. Не добавляйте его в оба объявления и не вставляйте седьмое поле в эти файлы.
Сохраните и выполните определение таблицы. Here-документ буквально записывает SQL-текст между маркерами SQL. Параметр Beeline -f выполняет сохранённый скрипт; URL подключения и имя пользователя относятся к подготовленной локальной службе Hive:
cat > /home/labex/project/queries/create-partitioned-orders.sql <<'SQL'
CREATE EXTERNAL TABLE retail_partitions.orders (
order_id STRING, customer_id STRING, product_id STRING,
quantity INT, unit_price DECIMAL(10,2), order_status STRING
)
PARTITIONED BY (order_date DATE)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 'hdfs://localhost:9000/user/labex/hive-partitions/orders'
TBLPROPERTIES ('skip.header.line.count'='1', 'external.table.purge'='false');
SQL
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/create-partitioned-orders.sql
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "DESCRIBE retail_partitions.orders;"
DESCRIBE включает обычные поля и сведения о разделах. Теперь посчитайте строки до регистрации разделов:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT COUNT(*) FROM retail_partitions.orders;" > /home/labex/project/output/before-registration.tsv
cat /home/labex/project/output/before-registration.tsv
Ожидается 0. Определение таблицы существует, файлы под её базовым каталогом тоже, но у новой таблицы ещё нет записей разделов. Это граница метаданных, а не свидетельство удаления CSV.
Зарегистрируйте два существующих ежедневных расположения
На этом шаге вы свяжете каждое значение даты с фактическим каталогом. ALTER TABLE ... ADD PARTITION добавляет записи разделов в Metastore. Каждый PARTITION (...) задаёт значение даты, а его LOCATION — соответствующие файлы. Это статические разделы: каждое значение указывается явно.
Сохраните обе регистрации в одном скрипте:
cat > /home/labex/project/queries/register-first-dates.sql <<'SQL'
ALTER TABLE retail_partitions.orders ADD
PARTITION (order_date='2026-10-14') LOCATION 'hdfs://localhost:9000/user/labex/hive-partitions/orders/order_date=2026-10-14'
PARTITION (order_date='2026-10-15') LOCATION 'hdfs://localhost:9000/user/labex/hive-partitions/orders/order_date=2026-10-15';
SQL
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/register-first-dates.sql
Выведите зарегистрированные значения и прочитайте столбец даты:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SHOW PARTITIONS retail_partitions.orders;" > /home/labex/project/output/registered-dates.tsv
cat /home/labex/project/output/registered-dates.tsv
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT order_id, order_date FROM retail_partitions.orders ORDER BY order_id;" > /home/labex/project/output/registered-orders.tsv
cat /home/labex/project/output/registered-orders.tsv
SHOW PARTITIONS должен включать 14 и 15 октября. Запрос возвращает o1–o3 с 14 октября и o4–o6 с 15 октября. Дата поступила из каждого зарегистрированного раздела, а не из скрытого седьмого поля CSV.
Регистрация указывает на существующие данные; она не копирует и не переписывает исходные файлы. Теперь таблица предоставляет все шесть заказов, включая pending и refunded. Отчёту оплаченных продаж по-прежнему нужен фильтр статуса.
Сначала добавьте файлы, затем зарегистрируйте новую дату
На этом шаге вы докажете, что новый каталог и новая запись раздела — отдельные действия. Изучите подготовленные локальные данные за 16 октября:
cat /home/labex/project/data/orders-2026-10-16.csv
Создайте каталог HDFS и загрузите файл. Эти знакомые команды влияют только на хранение:
hdfs dfs -mkdir -p /user/labex/hive-partitions/orders/order_date=2026-10-16
hdfs dfs -put /home/labex/project/data/orders-2026-10-16.csv /user/labex/hive-partitions/orders/order_date=2026-10-16/orders.csv
До регистрации запросите у Hive число строк за эту дату:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT COUNT(*) FROM retail_partitions.orders WHERE order_date = DATE '2026-10-16';" > /home/labex/project/output/new-date-before.tsv
cat /home/labex/project/output/new-date-before.tsv
Ожидается 0, несмотря на загруженный файл. Добавьте недостающие метаданные и повторите запрос этой даты:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "ALTER TABLE retail_partitions.orders ADD PARTITION (order_date='2026-10-16') LOCATION 'hdfs://localhost:9000/user/labex/hive-partitions/orders/order_date=2026-10-16';"
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT order_id, customer_id, order_status, order_date FROM retail_partitions.orders WHERE order_date = DATE '2026-10-16' ORDER BY order_id;" > /home/labex/project/output/new-date-orders.tsv
cat /home/labex/project/output/new-date-orders.tsv
Теперь появляются o7/c1/paid и o8/c2/pending с 16 октября. Hive может связать это значение раздела с загруженным каталогом. Намеренная проверка до и после объясняет, почему новый файл может присутствовать в HDFS, но отсутствовать в отчёте.
Прочитайте запрос с фильтром раздела и его план
На этом шаге вы выберете одну зарегистрированную дату и изучите планирование запроса в Hive. Сохраните запрос со столбцом раздела в WHERE:
cat > /home/labex/project/queries/query-sales-partition.sql <<'SQL'
SELECT order_id, quantity, order_date
FROM retail_partitions.orders
WHERE order_date = DATE '2026-10-15'
ORDER BY order_id;
SQL
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/query-sales-partition.sql > /home/labex/project/output/selected-partition.tsv
cat /home/labex/project/output/selected-partition.tsv
Ожидаются o4/2, o5/1 и o6/2, все с 15 октября. Это выбор даты, а не фильтр оплаченных продаж: возвращённый o5 правильно остаётся в этом конкретном запросе.
EXPLAIN описывает запрос, не возвращая строки данных. Его параметр DEPENDENCY сосредоточен на таблицах и разделах, которые прочитает запрос. Этот компактный вид позволяет изучить выбор входных данных без предварительного изучения внутреннего устройства этапов выполнения. Добавьте перед тем же запросом EXPLAIN DEPENDENCY и сохраните результат:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "EXPLAIN DEPENDENCY SELECT order_id, quantity, order_date
FROM retail_partitions.orders
WHERE order_date = DATE '2026-10-15'
ORDER BY order_id;" > /home/labex/project/output/partition-plan.txt
cat /home/labex/project/output/partition-plan.txt
Результат — JSON, текстовый формат именованных полей и списков. Найдите input_tables с именем retail_partitions@orders и input_partitions, у которого единственное partitionName оканчивается на order_date=2026-10-15. Две другие даты отсутствуют в списке входных данных. Условие даты позволяет Hive выбрать нужный зарегистрированный раздел до чтения записей; это называется отсечением разделов (partition pruning). Маленький пример предназначен для понимания выбора, поэтому время запроса не даёт осмысленного сравнения производительности.
Наконец, снова выведите зарегистрированные разделы:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SHOW PARTITIONS retail_partitions.orders;"
Все три даты должны оставаться зарегистрированными. Выбор одной даты меняет входные данные запроса; он не удаляет другие записи разделов и их файлы. Теперь у вас есть свидетельства и уровня хранения, и уровня каталога, чтобы объяснить, какие ежедневные данные видит запрос.
Итоги
Вы отделили поля файлов от столбца раздела, зарегистрировали ежедневные расположения HDFS в Hive и увидели, что новый каталог оставался невидимым до добавления раздела. Затем вы выбрали одну дату и изучили план запроса, сохранив все даты. Далее вы сохраните результаты запроса в повторно используемой столбцовой таблице ORC.



