Введение
Общественная площадка хранит подтверждённые посещения в архиве Hive. Одобренное исправление заменяет весь набор подтверждённых записей за дату. Это не дополнение к строкам за прошлый день. Для одной одобренной даты теперь есть два подтверждённых посещения, а для другой — ни одного. Остальные даты, включая позднее добавленное посещение, должны сохраниться без изменений.
Вы сравните добавление и замену на учебных таблицах, затем сохраните и выполните SQL-файл с точно ограниченной областью записи в настоящем ORC-архиве. Вы также повторно выполните этот файл и снова прочитаете результат. В среде уже работают Hive и HDFS, подготовлены независимые исходные записи, кандидаты на исправление и архив.
Предполагается, что вы уже знакомы с внешними таблицами Hive, SELECT с WHERE, столбцами партиционирования, ORC и основными путями HDFS. В этой лабораторной работе вы освоите статическую партицию назначения и замену данных за дату целиком. Все действия выполняются на вкладке Terminal. 65 минут — оценка автора, включающая чтение и обычные ошибки.
Безопасно сравните добавление и замену
На этом шаге вы прочитаете данные обычного дня в архиве, а затем сравните три области записи на учебных таблицах. Во время этого сравнения настоящий архив должен остаться неизменным.
Откройте Terminal. На протяжении всей работы используйте подготовленный рабочий каталог:
cd /home/labex/project
Локальный каталог venue содержит справочные CSV-файлы и список одобренных дат. cat показывает содержимое файла, не изменяя его:
cat venue/approved-days.txt
2026-10-02
2026-10-03
Только эти даты настоящего архива разрешено заменять. Сначала прочитайте данные обычного дня. Beeline отправляет SQL в HiveServer2. В следующей команде -u задаёт адрес подключения JDBC, -n labex — имя пользователя клиента, а -e — текст SQL. Двойные кавычки объединяют этот текст в один аргумент оболочки; одинарные кавычки внутри ограничивают значения SQL. DATE '...' явно задаёт тип даты.
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "SELECT * FROM venue_archive.archive WHERE visit_date=DATE '2026-10-04' ORDER BY visit_id;"
Прочитайте строки данных под сообщениями запуска. Для этой даты есть v4 / Music / 4 и v5 / LateWalk / 2. Позднее добавленное посещение v5 допустимо и должно сохраниться. Образ может выводить уведомления SLF4J о нескольких привязках журналирования; это отдельные сообщения, не ошибки SQL. Прежде чем продолжать, дождитесь возврата к приглашению командной строки.
Теперь изучите весь источник кандидатов, включая отменённые записи:
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "SELECT * FROM venue_archive.candidate ORDER BY visit_date,visit_id;"
Для 2 октября есть c21 / PrintWorkshop / 5 и c22 / Bookbinding / 2, обе записи имеют статус confirmed. Для 3 октября есть строка cancelled. Архив хранит только строки confirmed, поэтому правильный набор замены за 3 октября пуст. Отсутствие даты в отфильтрованном результате не означает, что старые данные архива за эту дату нужно оставить. Список одобренных дат и фильтр подтверждённых строк отвечают на разные вопросы.
Проверьте, откуда три настоящие таблицы читают данные и куда записывают их. DESCRIBE FORMATTED добавляет метаданные хранения к определениям столбцов: найдите Table Type, Location и InputFormat в каждом результате. Длинный вывод также содержит подробности движка; перед любой записью сосредоточьтесь на этих полях.
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "DESCRIBE FORMATTED venue_archive.raw; DESCRIBE FORMATTED venue_archive.candidate; DESCRIBE FORMATTED venue_archive.archive;"
Все три объекта имеют тип EXTERNAL_TABLE. Исходные записи находятся в hdfs://localhost:9000/user/labex/venue-archive/raw; путь кандидатов заканчивается на /user/labex/venue-archive/candidate. Оба источника читаются как текст. Архив расположен в hdfs://localhost:9000/warehouse/external/venue_archive.db/archive, а его формат ввода заканчивается на OrcInputFormat. Локальные файлы venue/*.csv — справочные копии, а не архив. Сохраните предоставленные соответствия таблиц и путей, а также исходные файлы.
Прежде чем менять настоящий архив, используйте две учебные таблицы: practice_days разбита на партиции по датам, а practice_whole хранит дату в обычном столбце. Изначально в них находятся подтверждённые посещения из исходных данных. Следующие команды намеренно демонстрируют неправильные результаты только на этих учебных таблицах.
INSERT INTO добавляет строки. PARTITION(visit_date='2026-10-02') — статическая партиция назначения: буквальное значение даты определяет, куда попадёт каждая выбранная строка. Поэтому SELECT должен возвращать только три столбца, не являющихся столбцами партиционирования. Отдельное условие WHERE выбирает исходные строки. Указание назначения не фильтрует источник автоматически.
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "INSERT INTO TABLE venue_archive.practice_days PARTITION(visit_date='2026-10-02') SELECT visit_id,activity,visitors FROM venue_archive.candidate WHERE visit_date=DATE '2026-10-02' AND record_status='confirmed'; SELECT * FROM venue_archive.practice_days WHERE visit_date=DATE '2026-10-02' ORDER BY visit_id;"
Результат содержит c21, c22 и старую строку v2. SQL выполнен успешно, но условие полной замены нарушено. Повторное добавление того же исправления создало бы ещё больше дубликатов.
INSERT OVERWRITE заменяет существующие строки назначения. В непартиционированной таблице practice_whole назначением служит вся таблица. Посмотрите, как исчезнут остальные даты:
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "INSERT OVERWRITE TABLE venue_archive.practice_whole SELECT visit_id,activity,visitors,visit_date FROM venue_archive.candidate WHERE visit_date=DATE '2026-10-02' AND record_status='confirmed'; SELECT * FROM venue_archive.practice_whole ORDER BY visit_date,visit_id;"
Остались только две строки за 2 октября. Успешная запись во всю таблицу может незаметно удалить данные других дат. Восстановите эту учебную таблицу из её полного исходного набора:
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "INSERT OVERWRITE TABLE venue_archive.practice_whole SELECT visit_id,activity,visitors,visit_date FROM venue_archive.raw WHERE record_status='confirmed'; SELECT * FROM venue_archive.practice_whole ORDER BY visit_date,visit_id;"
Все пять исходных строк вернулись. Наконец, совместите OVERWRITE со статической партицией по дате в practice_days:
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "INSERT OVERWRITE TABLE venue_archive.practice_days PARTITION(visit_date='2026-10-02') SELECT visit_id,activity,visitors FROM venue_archive.candidate WHERE visit_date=DATE '2026-10-02' AND record_status='confirmed'; SELECT * FROM venue_archive.practice_days ORDER BY visit_date,visit_id;"
Теперь строк шесть: исходная за 1 октября, две исправленные за 2 октября, исходная за 3 октября и оба посещения за 4 октября. Старой v2 больше нет. Именно такая область записи нужна для настоящего архива.
Если Beeline сообщает о неверном имени таблицы, SQL не нашёл нужный объект. Проверьте написание с помощью уже знакомой команды только для чтения ниже, затем повторите исправленную команду. Ошибку пути к файлу можно исследовать с помощью pwd и ls venue; вернитесь командой cd, приведённой выше. Не пересоздавайте таблицы и не запускайте настройку среды заново ради исправления опечатки.
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "SHOW TABLES IN venue_archive;"
Перед проверкой шага убедитесь, что учебная партиция за 2 октября содержит ровно c21 и c22, учебная таблица целиком снова содержит пять исходных строк, а настоящий архив по-прежнему хранит исходные данные.
Замените данные одобренной даты с подтверждёнными записями
На этом шаге вы сохраните и выполните настоящую замену за 2 октября. Продолжайте в Terminal, в /home/labex/project.
Настоящая таблица venue_archive.archive — внешняя нетранзакционная ORC-таблица с партициями visit_date DATE. Её исходные данные и кандидаты — независимые внешние текстовые таблицы с разделителем-запятой. Разрешено заменять только одобренные даты архива. Нельзя редактировать исходные файлы, менять определения или расположения таблиц, переназначать партиции, создавать дополнительные даты или перестраивать весь архив. Для 1 и 4 октября должны сохраниться исходные данные и существующие файлы HDFS. Перезапись даже идентичных строк выходит за одобренные границы.
Перед записью изучите список настоящих партиций и структуру столбцов. SHOW PARTITIONS перечисляет зарегистрированные партиции по датам; DESCRIBE показывает обычные столбцы, а затем сведения о партиционировании:
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "SHOW PARTITIONS venue_archive.archive; DESCRIBE venue_archive.archive;"
Четыре даты — с 1 по 4 октября. Обычные столбцы: visit_id STRING, activity STRING и visitors INT; visit_date DATE — столбец партиционирования. Сохраните это соответствие и формат ORC.
Сохраните SQL в редактируемый файл, чтобы можно было изучить, исправить и повторить ту же операцию. nano — текстовый редактор внутри Terminal. Следующая команда открывает replace-approved-days.sql в текущем рабочем каталоге; поскольку файл новый, область редактирования сначала пуста:
nano replace-approved-days.sql
Введите следующие пять строк SQL в nano, а не в приглашение оболочки. Одинарные кавычки ограничивают значения SQL, а точка с запятой завершает оператор. Остановитесь после последней точки с запятой, не добавляя пустую строку; при сохранении nano сам добавляет завершающий перевод строки:
INSERT OVERWRITE TABLE venue_archive.archive
PARTITION(visit_date='2026-10-02')
SELECT visit_id,activity,visitors
FROM venue_archive.candidate
WHERE visit_date=DATE '2026-10-02' AND record_status='confirmed';
Стрелками перейдите к символу, который нужно исправить; Home и End перемещают в начало и конец текущей строки. Backspace удаляет символ слева от курсора; Delete удаляет символ под курсором. Введите исправленный текст на его место. В нижней панели nano знак ^ означает Ctrl. Нажмите Ctrl+O, чтобы сохранить: в File Name to Write оставьте показанное имя файла и нажмите Enter. Затем нажмите Ctrl+X, чтобы выйти. Дождитесь приглашения оболочки; SQL вводится в редакторе, а следующие команды — в этом приглашении.
Перед выполнением прочитайте сохранённый текст:
cat replace-approved-days.sql
Проверьте обе даты в операторе: статическое назначение и фильтр источника должны указывать 2 октября. Исправление — полный набор подтверждённых записей, включающий и c21, и c22. Не нужно сопоставлять старые идентификаторы посещений или обновлять строки по отдельности.
Параметр Beeline -f читает SQL из файла. Выполните сохранённый файл:
beeline -u jdbc:hive2://localhost:10000/default -n labex -f replace-approved-days.sql
Затем прочитайте данные всех четырёх дат, как это сделал бы потребитель архива:
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "SELECT visit_date,visit_id,activity,visitors FROM venue_archive.archive ORDER BY visit_date,visit_id;"
Ожидаются шесть строк. За 2 октября находятся c21 / PrintWorkshop / 5 и c22 / Bookbinding / 2, а v2 отсутствует. За 3 октября пока остаётся старая v3. Записи v1 за 1 октября, а также v4 и v5 за 4 октября не изменились.
Подключение Beeline идентифицирует вас как labex. HiveServer2 выполняет запись в хранилище от имени своего служебного пользователя hive, поэтому владельцем новых ORC-файлов может быть hive:bigdata. Менять их владельца или разрешения не нужно. NameNode в HDFS работает под собственной служебной учётной записью hdfs.
Если в операторе SQL есть синтаксическая ошибка, изучите сохранённый файл с помощью cat, затем снова откройте его командой nano replace-approved-days.sql. Стрелками найдите оператор, указанный в ошибке Beeline. При необходимости исправьте имя таблицы, даты, кавычки или точку с запятой, сохранив остальные строки SQL. Сохраните через Ctrl+O, Enter, затем выйдите через Ctrl+X. Снова прочитайте файл перед повторным выполнением -f. Если вы случайно добавили строки к этой одобренной дате, та же правильная перезапись партиции удалит устаревшие и повторяющиеся строки. Такое восстановление относится к одобренной дате и не даёт права перестраивать защищённую дату.
Примените замену пустым набором и повторно выполните файл
На этом шаге вы очистите одобренную партицию за 3 октября, затем дважды выполните полный файл исправления и убедитесь, что строки в архиве не накапливаются. Продолжайте в Terminal, в /home/labex/project.
Отмена тоже является исправлением. Список одобренных дат включает 3 октября, но среди кандидатов за эту дату нет подтверждённых посещений. Сначала выполните выборку из источника:
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "SELECT visit_id,activity,visitors FROM venue_archive.candidate WHERE visit_date=DATE '2026-10-03' AND record_status='confirmed';"
Строк данных нет. В правильном итоговом архиве для этой даты тоже не должно быть строк. Если пропустить запись, старая v3 останется.
Снова откройте тот же файл. Сохраните существующий оператор для 2 октября; вы добавите один оператор, а не скопируете первый заново:
nano replace-approved-days.sql
Клавишей Down Arrow перейдите к пустой строке после точки с запятой первого оператора; если нужно перейти к концу строки, используйте End. На этой пустой строке один раз нажмите Enter, чтобы оставить одну пустую строку между операторами. Затем введите только пять новых строк ниже. Остановитесь после последней точки с запятой, не добавляя ещё одну пустую строку. Если продолжаете прерванное редактирование, сначала проверьте, нет ли уже оператора для 3 октября; исправьте его вместо добавления дубликата.
INSERT OVERWRITE TABLE venue_archive.archive
PARTITION(visit_date='2026-10-03')
SELECT visit_id,activity,visitors
FROM venue_archive.candidate
WHERE visit_date=DATE '2026-10-03' AND record_status='confirmed';
Сохраните через Ctrl+O, Enter, затем выйдите через Ctrl+X. Прочитайте полный сохранённый файл в приглашении оболочки:
cat replace-approved-days.sql
Убедитесь, что в нём ровно два оператора: исходный для 2 октября и следующий за ним новый для 3 октября. В каждом статическое назначение и фильтр источника должны указывать одобренную дату именно этого оператора. Если что-то неверно, снова откройте тот же файл в nano, исправьте только затронутые строки, сохраните и снова изучите его.
Впервые выполните этот полный сохранённый файл:
beeline -u jdbc:hive2://localhost:10000/default -n labex -f replace-approved-days.sql
Статическая перезапись с пустой выборкой удаляет старые строки партиции назначения. Дата остаётся зарегистрированной. Наличие физических файлов в пустой партиции определяет движок хранения; не создавайте самостоятельно файлы-заглушки CSV или ORC.
Прочитайте зарегистрированные даты и полный результат:
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "SHOW PARTITIONS venue_archive.archive; SELECT visit_date,visit_id,activity,visitors FROM venue_archive.archive ORDER BY visit_date,visit_id; SELECT COUNT(*) FROM venue_archive.archive WHERE visit_date=DATE '2026-10-03';"
По-прежнему перечислены все четыре партиции. Полный результат содержит пять строк: v1, c21, c22, v4 и v5. Количество за 3 октября равно 0. Две даты в списке одобрений не означают, что обе партиции должны быть непустыми.
Теперь снова выполните тот же сохранённый файл, ничего в нём не меняя:
beeline -u jdbc:hive2://localhost:10000/default -n labex -f replace-approved-days.sql
Повторите чтение архива:
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "SELECT visit_date,visit_id,activity,visitors FROM venue_archive.archive ORDER BY visit_date,visit_id; SELECT COUNT(*) FROM venue_archive.archive;"
Остались те же пять строк, общее количество — 5. Для предоставленных источников такая замена повторяема: она не добавляет дубликаты. Повторное выполнение может пересоздать файлы одобренных партиций; исходные файлы дат вне области изменений должны остаться нетронутыми.
Исходный источник можно изучить знакомыми командами HDFS. Здесь -cat читает конкретный исходный файл, а не производный ORC-архив:
hdfs dfs -cat /user/labex/venue-archive/raw/raw.csv
В нём по-прежнему находятся исходные v2 и v3. Изменение производного архива не переписывает его исходную историю. Кандидаты и список одобрений также должны остаться в предоставленном виде. Оставьте SQL-файл в рабочем каталоге. Проверки наблюдают текущие данные Hive, определения, область изменений и защищённые файлы; они не выполняют произвольный сохранённый SQL. Фактическое повторное выполнение и последующее чтение служат самопроверкой сохранённой операции.
Резюме
Вы сравнили добавление, замену всей таблицы и замену статической партиции. Затем заменили полный набор за одобренный день, применили допустимую замену пустым набором и повторно выполнили тот же сохранённый SQL без накопления строк. Независимая исходная история и остальные даты архива сохранились.



