Подготовьте файлы для пакетного задания

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

Введение

Теперь ваша розничная компания получает файлы из двух магазинов за две даты. Программа подсчёта обработает переданные ей файлы; она не может угадать нужный день или понять, что старый файл результатов следует исключить. Поэтому правильная программа может дать неверный ответ на вопрос бизнеса, если входные данные выбраны неправильно.

Вы научились сохранять, копировать, архивировать и выгружать отдельные файлы. Здесь вы перейдёте от одного файла к входным данным пакета — осознанно выбранному набору файлов. Вы разделите даты, сравните число файлов и их содержимое и сохраните манифест: список точных путей HDFS, выбранных для одного запуска.

HDFS хранит содержимое файлов, не понимая столбцов продаж, дат или заголовков CSV. Вы увидите эту границу перед организацией входных данных. Локальные файлы и пример прошлого результата подготовлены для этой работы независимо; состояние предыдущих работ не требуется. Используйте терминал.

Отделите сохранённый текст от его смысла

На этом шаге вы изучите полученные локальные файлы и увидите, что загрузка CSV сохраняет заголовок как обычный текст.

Начните в локальном рабочем каталоге:

cd /home/labex/project

Выведите список файлов за первую дату. Дата в имени каталога — полезное соглашение, а не тип данных, соблюдение которого обеспечивает HDFS:

ls /home/labex/project/data/2026-10-14

Вы должны увидеть store-east.txt и store-west.txt. Прочитайте их в этом порядке локальной командой cat:

cat /home/labex/project/data/2026-10-14/store-east.txt /home/labex/project/data/2026-10-14/store-west.txt

Ожидаемый текст:

notebook pen
notebook
folder pen

Здесь каждое слово — записанное обозначение товара. Эти файлы подходят для подсчёта слов, который вы изучите позже. Другая система предоставила иной формат. Прочитайте небольшой пример CSV:

cat /home/labex/project/data/orders-preview.csv

Ожидаемый текст:

product,quantity
notebook,2
pen,1

CSV использует запятые для разделения полей. Первая строка — заголовок, задающий имена столбцов; две другие строки — записи о товарах. HDFS не удаляет первую строку автоматически и не интерпретирует quantity как целое число.

Храните этот пример отдельно от пакета обозначений товаров. Создайте для него каталог HDFS:

hdfs dfs -mkdir -p /user/labex/batch-inputs/preview

Загрузите CSV:

hdfs dfs -put /home/labex/project/data/orders-preview.csv /user/labex/batch-inputs/preview/orders.csv

Прочитайте его обратно:

hdfs dfs -cat /user/labex/batch-inputs/preview/orders.csv

Все три строки сохранились, включая заголовок. Нужно ли пропускать заголовок или преобразовывать число — решение на уровне обработки. Добавление этого файла во входные данные подсчёта слов изменило бы смысл вычисления, хотя каждый файл доступен для чтения.

Организуйте полученные файлы по датам

На этом шаге вы создадите для каждой даты отдельный каталог исходных данных и загрузите два соответствующих файла магазинов.

Используйте структуру каталогов, которая наглядно разделяет входные и выходные данные:

batch-inputs/
  raw/2026-10-14/       файлы товаров за первый день
  raw/2026-10-15/       файлы товаров за следующий день
  preview/             пример формата CSV
  results/previous-run/  подготовленный результат прошлого запуска

Прошлый результат — лишь учебный пример для выбора входных данных. Он не должен стать частью нового исходного пакета. Создайте два ежедневных каталога:

hdfs dfs -mkdir -p /user/labex/batch-inputs/raw/2026-10-14 /user/labex/batch-inputs/raw/2026-10-15

Шаблон оболочки *.txt соответствует локальным именам файлов, оканчивающимся на .txt. В следующей команде оболочка раскрывает локальный шаблон без кавычек в два исходных пути до запуска клиента HDFS. Последний аргумент — существующий каталог HDFS:

hdfs dfs -put /home/labex/project/data/2026-10-14/*.txt /user/labex/batch-inputs/raw/2026-10-14/

Теперь измените только дату в обоих местах, чтобы загрузить вторую порцию файлов:

hdfs dfs -put /home/labex/project/data/2026-10-15/*.txt /user/labex/batch-inputs/raw/2026-10-15/

Если файлы назначения уже существуют, изучите их, прежде чем решать что-либо перезаписывать. Сохранение исходных данных полезнее, чем их удаление лишь ради повторного выполнения команды загрузки.

Проверьте каждый пакет с помощью -count, изученной в работе о жизненном цикле:

hdfs dfs -count /user/labex/batch-inputs/raw/2026-10-14 /user/labex/batch-inputs/raw/2026-10-15

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

hdfs dfs -ls /user/labex/batch-inputs/raw/2026-10-14

Обе записи должны показывать ожидаемые имена магазинов внутри 2026-10-14. Несколько небольших файлов делают упражнение наглядным. В гораздо большем масштабе множество крошечных файлов создаёт в HDFS накладные расходы на метаданные; это не означает, что любой маленький файл обязательно нужно объединять с другими.

Выберите и проверьте один пакет

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

Перед выполнением команды предположите, какой каталог должен войти в манифест: всё дерево batch-inputs, всё дерево raw или только raw/2026-10-14? Узкий каталог даты соответствует запрошенному дню и исключает следующую дату, пример CSV и старые результаты.

Параметр HDFS -ls -C выводит пути без подробных столбцов списка. Примените его к выбранной дате:

hdfs dfs -ls -C /user/labex/batch-inputs/raw/2026-10-14

Два пути должны оканчиваться на store-east.txt и store-west.txt. Чтобы сохранённый список было удобно сравнивать, используйте конвейер оболочки |: он передаёт вывод первой команды второй. sort упорядочивает строки, а > сохраняет результат локально:

hdfs dfs -ls -C /user/labex/batch-inputs/raw/2026-10-14 | sort > /home/labex/project/output/input-manifest.txt

Прочитайте свой манифест:

cat /home/labex/project/output/input-manifest.txt

Ожидаемые пути:

/user/labex/batch-inputs/raw/2026-10-14/store-east.txt
/user/labex/batch-inputs/raw/2026-10-14/store-west.txt

Шаблон можно использовать и на стороне HDFS. Одинарные кавычки сохраняют *.txt, чтобы удалённые пути сопоставлял клиент HDFS, а не локальная оболочка:

hdfs dfs -cat '/user/labex/batch-inputs/raw/2026-10-14/*.txt' > /home/labex/project/output/selected-input.txt

Для этих имён HDFS читает файл east раньше файла west. Сохраните соответствующий локальный текст в таком же явно заданном порядке:

cat /home/labex/project/data/2026-10-14/store-east.txt /home/labex/project/data/2026-10-14/store-west.txt > /home/labex/project/output/expected-input.txt

Сравните два файла:

diff /home/labex/project/output/expected-input.txt /home/labex/project/output/selected-input.txt

Различия не должны появляться. В качестве дополнительной проверки wc -l подсчитывает строки в файле, завершающиеся символом новой строки:

wc -l /home/labex/project/output/selected-input.txt

Результат должен начинаться с 3. Это три строки текста с пятью обозначениями товаров, а не три заказа. Смысл записи определяется форматом файла и задачей, а не HDFS. Манифест, содержимое файлов и число строк вместе делают выбор входных данных явным.

Итоги

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

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