ファイルを 1 行ずつではなく、1 つの単位として読み取って処理する必要がありますが、Hadoop MapReduce アプリケーションでこれを行う方法が明確ではありません。ファイルの最初の行をキーとして使用できるヘッダーとして読み取り、次の行を値として使用できる 2 次元データ配列を構築するためのデータとして読み取る必要があります。次に、データの 2 次元配列全体 (つまり、値) に対して何らかの分析を行います。
以下は、私がこの問題にどのように取り組むことを計画しているかです。これが合理的に見えない場合、またはこれを行うためのより良い方法がある場合は、コメントをいただければ幸いです (これは私の最初の本格的な MapReduce アプリケーションなので、おそらく作成中です)。新人のミス):
テキスト ファイルの入力には、測点情報 (名前、緯度/経度、ID など) を含む 1 行と、年の値 (1956 年など) と 12 の月の値 (0.3 2.8 4.7 ...) を含む 1 つまたは複数の行が含まれています。スペースで。毎月の値 [number_of_years][12] の配列全体に対して処理を行う必要があるため、個々の行は単独では意味がありません。
カスタム キー クラスを作成し、WritableComparable を実装します。これにより、入力テキスト ファイルの最初の行のヘッダー情報が保持されます。
a) isSplitable() メソッドが false を返し、b) getRecordReader() メソッドがファイル分割を読み取り、それをカスタム キーおよび値クラスに変換する方法を知っているカスタム レコード リーダーを返す、カスタム入力形式クラスを作成します。
入力値 (月次値の 2 次元配列) を分析し、元のキー (ステーション ヘッダー情報) と出力値 (分析値の 2 次元配列) を出力するマッパー クラスを作成します。実行する実際の削減がないため、ラッパー レデューサー クラスのみがあります。
これが map reduce アプローチの適切な/正しいアプリケーションであるかどうかは明らかではありません。a) 単一のキーにマップされた単一の値 (データ配列) で分析を行っているため、および b) 単一の値しか存在しないためです。キーごとの値 (データ配列) の場合、実際の削減を実行する必要はありません。もう 1 つの問題は、処理しているファイルが比較的小さく、デフォルトの 64 MB の分割サイズよりもはるかに小さいことです。この場合、おそらく最初のタスクは、Definitive Hadoop O'Reilly book (p. 194 in the 2nd Edition) の SmallFilesToSequenceFileConverter の例に示されているように、入力ファイルをシーケンス ファイルに統合することでしょうか?
コメントや提案をお寄せいただきありがとうございます。