Введение
В первой работе Hive подготовленная таблица позволила сразу запрашивать строки заказов. Теперь компания предоставила CSV-файлы, но файл в хранилище ещё не является таблицей, которую Hive умеет запрашивать. Нужно описать его поля и указать каталог с данными.
Внешняя таблица — определение таблицы, ссылающееся на данные, которыми управляют отдельно от этого определения. Её схема задаёт имена и типы столбцов, а LOCATION указывает на сохранённые файлы. Создание определения не загружает файлы и не переписывает их содержимое. Hive хранит метаданные таблицы в Metastore, а записи остаются в хранилище.
Вы загрузите два простых источника CSV, сопоставите первый с явной схемой, переключите сопоставление на второй и удалите только временное определение внешней таблицы. Последний эксперимент использует явные свойства сохранения данных в версии Hive этого курса; это не обещание сохранности файлов при удалении любой возможной таблицы Hive. Службы и локальные данные подготовлены независимо, а предварительный курс Hadoop и знание языка программирования не требуются. Используйте терминал.
Изучите и загрузите исходные файлы
На этом шаге вы изучите формат CSV и скопируете два предоставленных файла в отдельные каталоги HDFS.
Начните в локальном проекте:
cd /home/labex/project
CSV разделяет поля запятыми. Эти учебные файлы содержат простые значения без запятых внутри, многострочного текста в кавычках и экранированных разделителей. Используемый здесь простой формат таблицы выбран для этих данных и не является универсальным разборщиком всех разновидностей CSV.
Локальная команда head -n 4 показывает первые четыре строки:
head -n 4 /home/labex/project/data/orders-a.csv
Вы должны увидеть заголовок и три записи заказов:
order_id,customer_id,product_id,quantity,unit_price,order_status,order_date
o1,c1,p1,2,10.00,paid,2026-10-14
o2,c2,p2,1,25.00,paid,2026-10-14
o3,c1,p1,1,10.00,pending,2026-10-14
Подсчитайте строки, завершающиеся символом новой строки, с помощью wc -l:
wc -l /home/labex/project/data/orders-a.csv /home/labex/project/data/orders-b.csv
В источнике A семь строк, но только шесть записей заказов; в источнике B три строки, но только две записи. Заголовок не должен стать строкой заказа.
HDFS — отдельная файловая система, используемая подготовленной службой Hive. Клиент hdfs dfs управляет её файлами. -mkdir -p создаёт указанные каталоги HDFS и недостающие родительские каталоги:
hdfs dfs -mkdir -p /user/labex/hive-mapping/source-a /user/labex/hive-mapping/source-b
Операция -put копирует локальный источник в назначение HDFS, сохраняя оригинал:
hdfs dfs -put /home/labex/project/data/orders-a.csv /user/labex/hive-mapping/source-a/orders.csv
Загрузите второй источник в его собственный каталог:
hdfs dfs -put /home/labex/project/data/orders-b.csv /user/labex/hive-mapping/source-b/orders.csv
Успешная загрузка обычно ничего не выводит. Уже существующее назначение следует изучить перед решением о перезаписи; не удаляйте исходные данные лишь ради повторения команды. Прочитайте первый файл HDFS с помощью -cat:
hdfs dfs -cat /user/labex/hive-mapping/source-a/orders.csv
Заголовок и шесть записей остались на месте. Загрузка сохраняет байты; определение таблицы сообщит Hive, как их интерпретировать.
Определите сопоставление файла и таблицы
На этом шаге вы создадите внешнюю таблицу с явно заданными полями, типами, расположением каталога и обработкой заголовка.
Порядок полей источника должен совпадать с порядком столбцов таблицы. Используйте STRING для идентификаторов и статуса, INT для целого количества, DECIMAL(10,2) для цены с фиксированной точкой и DATE для даты в формате ISO. Десятичные цены позволяют избежать двоичных приближений с плавающей точкой в последующих денежных вычислениях.
CREATE DATABASE IF NOT EXISTS при необходимости создаёт пространство имён. Затем CREATE EXTERNAL TABLE регистрирует определение таблицы. Условия формата задают текст с разделителем-запятой; LOCATION указывает каталог, поэтому храните посторонние файлы и резервные копии вне него. Два свойства пропускают одну строку заголовка в каждом файле и явно отключают удаление данных внешней таблицы при DROP в этой среде.
Сохраните полный SQL-файл. Как и в первой работе, here-документ оболочки записывает буквальные строки до закрывающего разделителя SQL:
cat > /home/labex/project/queries/create-orders.sql <<'SQL'
CREATE DATABASE IF NOT EXISTS retail_mapping;
USE retail_mapping;
CREATE EXTERNAL TABLE raw_orders (
order_id STRING,
customer_id STRING,
product_id STRING,
quantity INT,
unit_price DECIMAL(10,2),
order_status STRING,
order_date DATE
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 'hdfs://localhost:9000/user/labex/hive-mapping/source-a'
TBLPROPERTIES ('skip.header.line.count'='1', 'external.table.purge'='false');
SQL
Выполните его через Beeline. Подключение и параметр файла -f те же, что в первой работе:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true -f /home/labex/project/queries/create-orders.sql
Это операторы DDL (Data Definition Language, язык определения данных): SQL-операторы, определяющие объекты, например таблицы. Успешные DDL создают метаданные, а не возвращают строки заказов. Если таблица уже существует после завершённого запуска, изучите её вместо удаления ради устранения сообщения.
DESCRIBE FORMATTED включает тип и расположение таблицы, а также её столбцы:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'DESCRIBE FORMATTED retail_mapping.raw_orders;'
Найдите EXTERNAL_TABLE и расположение, оканчивающееся на /hive-mapping/source-a. Это наблюдения о метаданных, а не доказательство правильного разбора каждой записи. Выполните и запрос. COUNT(*) считает строки таблицы, давая быструю проверку сопоставления. AS order_count даёт вычисленному результату имя столбца, называемое псевдонимом; это не переименовывает исходное поле и не меняет сохранённые записи:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'SELECT COUNT(*) AS order_count FROM retail_mapping.raw_orders; SELECT order_id, quantity, unit_price, order_date FROM retail_mapping.raw_orders ORDER BY order_id LIMIT 2;'
Количество должно быть 6, а не семь текстовых строк файла. Первые две записи должны содержать ID o1, o2, количества 2, 1, цены, численно равные 10.00, 25.00, и дату 2026-10-14. Вы проверили и обработку заголовка, и осмысленные типизированные столбцы.
Направьте ту же таблицу на новый источник
На этом шаге вы измените расположение таблицы и предположите, как изменятся строки без перемещения исходных файлов.
У источника B те же поля, но он содержит заказы o7 и o8. Прочитайте сохранённый файл перед изменением метаданных:
hdfs dfs -cat /user/labex/hive-mapping/source-b/orders.csv
Вы должны увидеть заголовок и две записи. Предположите число строк таблицы после её переключения на этот каталог: две вместо шести. ALTER TABLE ... SET LOCATION меняет ссылку на каталог в определении таблицы. Команда не копирует старые данные в новый каталог и не объединяет две порции файлов.
Сохраните изменение метаданных:
cat > /home/labex/project/queries/map-second-source.sql <<'SQL'
ALTER TABLE retail_mapping.raw_orders SET LOCATION 'hdfs://localhost:9000/user/labex/hive-mapping/source-b';
SQL
Выполните его:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true -f /home/labex/project/queries/map-second-source.sql
Снова изучите и метаданные, и данные:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'DESCRIBE FORMATTED retail_mapping.raw_orders; SELECT COUNT(*) AS order_count FROM retail_mapping.raw_orders; SELECT order_id, quantity, unit_price FROM retail_mapping.raw_orders ORDER BY order_id;'
Найдите новое расположение source-b, количество 2 и строки o7 и o8. Их количества — 1 и 2, а цены численно равны 50.00 и 15.00. Определения столбцов не изменились; изменились только читаемые через них файлы.
Прочитайте старый файл, чтобы проверить, что изменение сопоставления не удалило его:
hdfs dfs -cat /user/labex/hive-mapping/source-a/orders.csv
Его шесть записей и заголовок должны остаться. Наличие файла и видимость через таблицу — разные факты: источник A существует, хотя эта таблица теперь читает источник B.
Удалите только временное определение таблицы
На этом шаге вы создадите и удалите определение внешней таблицы над сохранённым первым источником, оставив данные и основную таблицу.
Удаление определения таблицы и удаление её данных — разные операции. Для эксперимента используйте отдельное имя disposable_orders с явными свойствами сохранения внешних данных. Сохраняйте raw_orders, теперь сопоставленную с источником B, доступной на всём протяжении работы.
Создайте временное определение над источником A с той же известной схемой:
cat > /home/labex/project/queries/create-disposable.sql <<'SQL'
CREATE EXTERNAL TABLE retail_mapping.disposable_orders (
order_id STRING,
customer_id STRING,
product_id STRING,
quantity INT,
unit_price DECIMAL(10,2),
order_status STRING,
order_date DATE
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 'hdfs://localhost:9000/user/labex/hive-mapping/source-a'
TBLPROPERTIES ('skip.header.line.count'='1', 'external.table.purge'='false');
SQL
Выполните определение:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true -f /home/labex/project/queries/create-disposable.sql
Проверьте наличие обоих имён таблиц:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'SHOW TABLES IN retail_mapping;'
Вы должны увидеть disposable_orders и raw_orders. DROP TABLE удаляет определение таблицы. Здесь команда нацелена только на временную внешнюю таблицу, у которой свойство purge явно равно false:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'DROP TABLE retail_mapping.disposable_orders; SHOW TABLES IN retail_mapping;'
Должна остаться только raw_orders. Теперь изучите исходный файл независимо:
hdfs dfs -cat /user/labex/hive-mapping/source-a/orders.csv
Заголовок и шесть записей должны остаться. Наблюдаемое поведение относится к этой конфигурации внешней таблицы. Управляемая таблица или внешняя таблица с другими свойствами purge может удалить данные при DROP; не превращайте эксперимент в универсальное правило удаления.
Убедитесь, что основная таблица по-прежнему читает источник B:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'SELECT order_id FROM retail_mapping.raw_orders ORDER BY order_id;'
Вы должны по-прежнему увидеть o7 и o8. Вы разделили три операции, которые начинающие часто путают: загрузку байтов, регистрацию или изменение метаданных и удаление определения. Далее вы используете правильно сопоставленные строки для фильтрации условий и обработки пропущенных значений.
Итоги
Вы загрузили простые источники CSV, задали порядок и типы полей, пропустили заголовки и зарегистрировали внешнюю таблицу в явном каталоге HDFS. Вы проверили метаданные и реальные записи, затем изменили расположение таблицы без перемещения исходных файлов.
Наконец, вы удалили временное определение внешней таблицы с явными настройками сохранения и убедились, что файлы и основная таблица остались доступны. Далее вы будете выбирать строки и обрабатывать пропуски на основе надёжного сопоставления.



