はじめに
小売業者に、2店舗から2日分のファイルが届くようになりました。集計プログラムは渡されたファイルを処理します。対象の日付を推測したり、古い結果ファイルを除外すべきだと判断したりはできません。そのため、プログラムが正しくても、入力の選択が間違っていると業務上の答えは誤ってしまいます。
これまで、個々のファイルの保管、コピー、アーカイブ、エクスポートを学びました。今回は1つのファイルから、意図的に選んだファイルの集合であるバッチ入力へ進みます。日付を分け、ファイル数と内容を比べ、1回の実行で選択する 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 はカンマでフィールドを区切ります。最初の行は列名を示すヘッダーで、残りの2行が業務上の記録です。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
ヘッダーを含む3行がすべて残っています。ヘッダーを読み飛ばすか、数値を解析するかは、処理側で判断することです。このファイルを単語ラベルの入力に混ぜると、すべてのファイルが読めたとしても、計算の意味が変わってしまいます。
届いたファイルを日付ごとに整理する
このステップでは、日付ごとに元データ用のディレクトリを用意し、対応する2店舗のファイルをアップロードします。
入力と出力の違いが分かるディレクトリ構成を使います。
batch-inputs/
raw/2026-10-14/ 最初の日の商品ファイル
raw/2026-10-15/ 翌日の商品ファイル
preview/ CSV 形式の例
results/previous-run/ 準備済みの過去の実行結果
過去の結果は、入力の選択を学ぶためのサンプルです。新しい元データのバッチには含めません。2日分のディレクトリを作成します。
hdfs dfs -mkdir -p /user/labex/batch-inputs/raw/2026-10-14 /user/labex/batch-inputs/raw/2026-10-15
シェルの *.txt パターンは、.txt で終わるローカルファイル名に一致します。次のコマンドでは、HDFS クライアントを実行する前に、シェルが引用符のないローカルのパターンを2つの入力パスに展開します。最後の引数は、既存の HDFS ディレクトリです。
hdfs dfs -put /home/labex/project/data/2026-10-14/*.txt /user/labex/batch-inputs/raw/2026-10-14/
今度は両方の場所の日付だけを変え、2回目に届いたファイルをアップロードします。
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
各日付に1つのディレクトリと2つのファイルがあるはずです。日付によって記録が違うので、内容のサイズの列は一致しなくても構いません。ファイル数だけでは日付を正しく選んだ証拠にはならないため、最初の日の一覧も表示します。
hdfs dfs -ls /user/labex/batch-inputs/raw/2026-10-14
両方の項目で、2026-10-14 の下に期待する店舗名があることを確かめます。この演習では、分かりやすくするために少数の小さなファイルを使っています。規模が大きくなると、大量の小さなファイルによって HDFS のメタデータ管理の負担が増えます。ただし、小さなファイルを常にすべて結合すべきという意味ではありません。
1つのバッチを選んで確認する
このステップでは、10月14日用の正確なファイル一覧を作り、その入力テキストをローカルに届いたデータと比較します。
コマンドを実行する前に、マニフェストに含めるべきディレクトリを予想してください。batch-inputs ツリー全体、raw ツリー全体、それとも raw/2026-10-14 だけでしょうか? 対象日だけに絞ったディレクトリなら、指定日に一致し、翌日、CSV サンプル、古い結果を除外できます。
HDFS の -ls -C オプションは、詳細の列なしでパスを表示します。選択した日付に対して使います。
hdfs dfs -ls -C /user/labex/batch-inputs/raw/2026-10-14
2つのパスの末尾は 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
2つを比較します。
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 で始まるはずです。これは5つの商品ラベルを含む3行のテキストであり、3件の注文ではありません。記録の意味は、HDFS ではなく、ファイル形式と作業の目的によって決まります。マニフェスト、ファイルの内容、行数を合わせて確認することで、選んだ入力を明確にできます。
まとめ
CSV サンプルと商品ラベルのプレーンテキストを分け、日付ごとのディレクトリに元データを保存し、マニフェストで1つのバッチを選択しました。アップロードの成功やファイル数だけを信じるのではなく、ファイル名と内容の両方を確認しました。
次のチャレンジでは、これまで練習したファイル管理と入力選択のスキルで、新しく届いたファイルを整理します。



