7

レコードが (ファイルではなく) 複数の行にまたがる可能性がある大きな JSON ファイルを取り込む必要があります (データ プロバイダーがそれをどのように記述しているかに完全に依存します)。

Elephant-Bird は LZO 圧縮を想定していますが、データ プロバイダーがこれを行っていないことはわかっています。

Dzone の記事http://java.dzone.com/articles/hadoop-practiceでは、JSON レコードが同じ行にあると想定しています。

JSON...ファイルをつぶすことを除いて、どんなアイデアも巨大になります...JSONが壊れないようにファイルを適切に分割する方法について。

編集:ファイルではなく行

4

2 に答える 2

2

他の提案がなく、JSONのフォーマット方法によっては、オプションがある場合があります。

Dzoneの記事で指摘されているように、問題は、分割点にジャンプしたときに簡単に見つけることができる終了要素がJSONにないことです。

これで、入力JSONに「きれいな」または標準のフォーマットがある場合、カスタム入力フォーマットの実装でこれを利用できます。

たとえば、Dzoneの例からサンプルJSONを取得します。

{
  "results" :
    [
      {
        "created_at" : "Thu, 29 Dec 2011 21:46:01 +0000",
        "from_user" : "grep_alex",
        "text" : "RT @kevinweil: After a lot of hard work by ..."
      },
      {
        "created_at" : "Mon, 26 Dec 2011 21:18:37 +0000",
        "from_user" : "grep_alex",
        "text" : "@miguno pull request has been merged, thanks again!"
      }
    ]
}

この形式では、新しいレコードはそれぞれ、6つの空白と角かっこが開いた行から始まることがわかります(希望しますか?)。レコードは同様の形式で終了します-6つのスペースと閉じ括弧。

したがって、この場合のロジックは、6つのスペースと角かっこが開いた行が見つかるまで行を消費します。次に、6つのスペースと閉じ括弧が見つかるまでコンテンツをバッファリングします。次に、それをJavaオブジェクトに変換したいJSONデシリアライザーを使用します(または、複数行のテキストをマッパーに渡します。

于 2012-08-14T01:10:04.363 に答える