2017-02-01 2 views
2

経由してデータフローをクラウドストレージ上のネスト解除JSONファイルを読み込むことが可能である:私はちょうど私が行うことができますBigQueryのに最小限のフィルタリングで、これらのログを書きたい場合は読書は、Googleのデータフロー/でJSONをネストされたApacheのビーム

p.apply("read logfiles", TextIO.Read.from("gs://bucket/*").withCoder(TableRowJsonCoder.of())); 

private static class Formatter extends DoFn<TableRow,TableRow> { 

     @Override 
     public void processElement(ProcessContext c) throws Exception { 

      // .clone() since input is immutable 
      TableRow output = c.element().clone(); 

      // remove misleading timestamp field 
      output.remove("@timestamp"); 

      // set timestamp field by using the element's timestamp 
      output.set("timestamp", c.timestamp().toString()); 

      c.output(output); 
     } 
    } 
} 

しかし、このようにJSONファイルのネストされたフィールドにアクセスする方法はわかりません。

  1. のTableRowはrという名前RECORDが含まれている場合、それはさらにシリアライズ/デシリアライゼーションのせずにそのキー/値にアクセスすることは可能でしょうか?
  2. 私はJacksonライブラリと自分自身をデシリアライズ/シリアライズする必要がある場合は、それが戻って、私はこの方法を失うことを、パフォーマンスの一部を得るために、TextIO.Read代わりのTableRowJsonCoderの標準Coderを使用する方が理にかなっていますか?

EDIT

ファイルは改行で区切られており、このような何かを見て:

{"@timestamp":"2015-x", "message":"bla", "r":{"analyzed":"blub", "query": {"where":"9999"}}} 
{"@timestamp":"2015-x", "message":"blub", "r":{"analyzed":"bla", "query": {"where":"1111"}}} 
+0

ファイルはどのようにフォーマットされていますか?改行が区切られているのでしょうか、あるいは入れ子にされたレコードの1つの中に改行が潜在的に現れるでしょうか? –

+0

ファイルは改行で区切られており、入れ子になったレコードのいずれかに改行がないと思います。私は例を含めるために私の質問を編集しました。 – Tobi

答えて

4

をあなたの最善の策は、あなたが#2で説明したものを行うとジャクソンを使用することが考えられます直接。 TextIOの読み込みには、文字列コーダーを使ってファイルから行を読み取ってから、DoFnを使って要素を実際に解析するのが最も理にかなっています。次のようなもの:

PCollection<String> lines = pipeline 
    .apply(TextIO.from("gs://bucket/...")); 
PCollection<TableRow> objects = lines 
    .apply(ParDo.of(new DoFn<String, TableRow>() { 
    @Override 
    public void processElement(ProcessContext c) { 
     String json = c.element(); 
     SomeObject object = /* parse json using Jackson, etc. */; 
     TableRow row = /* create a table row from object */; 
     c.output(row); 
    } 
    }); 

複数のParDosを使用することもできます。

+0

最後に複数のParDosを使って解決しました。ありがとうございます。 – Tobi

関連する問題