5

以下のようなログファイルがあります

Begin ... 12-07-2008 02:00:05         ----> record1
incidentID: inc001
description: blah blah blah 
owner: abc 
status: resolved 
end .... 13-07-2008 02:00:05 
Begin ... 12-07-2008 03:00:05         ----> record2 
incidentID: inc002 
description: blah blah blahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblah
owner: abc 
status: resolved 
end .... 13-07-2008 03:00:05

これを処理するために mapreduce を使用したいと思います。そして、インシデントID、ステータス、およびインシデントにかかった時間を抽出したい

可変レコード長を持つ両方のレコードを処理する方法と、レコードが終了する前に入力分割が発生した場合はどうなりますか。

4

2 に答える 2

5

レコード区切り文字で適切にファイルを分割するには、独自の入力形式とレコード リーダーを作成する必要があります。

基本的に、レコード リーダーは分割バイト オフセットをシークし、次のいずれかが見つかるまで順方向にスキャンする (行を読み取る) 必要があります。

  • Begin ...ライン _
    • 次の行まで行を読み取りend ...、次のレコードの入力として開始と終了の間にこれらの行を提供します
  • 分割の終わりを過ぎてスキャンするか、EOF を見つけます

これは、Mahout のXMLInputFormatが複数行の XML を入力として処理する方法とアルゴリズムが似ています。実際、状況を処理するためにこのソース コードを直接修正できる場合があります。

@irWの回答で述べたようにNLineInputFormat、レコードのレコードごとの行数が固定されている場合の別のオプションですが、入力形式のgetSplits()メソッドで行オフセットを検出するためにファイル全体を開いて読み取る必要があるため、大きなファイルの場合は実際には非効率的です。

于 2013-07-18T10:36:22.953 に答える