Google cloud dataflow 在googledataflow/apachebeam中读取嵌套的JSON

Google cloud dataflow 在googledataflow/apachebeam中读取嵌套的JSON,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,可以通过以下方式使用数据流读取云存储上未列出的JSON文件: p.apply("read logfiles", TextIO.Read.from("gs://bucket/*").withCoder(TableRowJsonCoder.of())); 如果我只想在BigQuery中使用最少的过滤来编写这些日志,我可以使用如下的DoFn: private static class Formatter extends DoFn<TableRow,TableRow> {

可以通过以下方式使用数据流读取云存储上未列出的JSON文件:

p.apply("read logfiles", TextIO.Read.from("gs://bucket/*").withCoder(TableRowJsonCoder.of()));
如果我只想在BigQuery中使用最少的过滤来编写这些日志,我可以使用如下的DoFn:

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);
        }
    }
}

你最好的选择可能是按照你在#2中描述的那样,直接使用Jackson。最有意义的做法是让TextIO read执行其构建目的——使用字符串编码器从文件中读取行——然后使用
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);
    }
  });
p收集线=管道
.apply(TextIO.from(“gs://bucket/…));
PCollection对象=线
.适用(新DoFn()的第{
@凌驾
公共void processElement(ProcessContext c){
字符串json=c.element();
SomeObject object=/*使用Jackson等解析json。*/;
TableRow row=/*从对象*创建表行;
c、 输出(行);
}
});

请注意,您也可以使用多个PARDO来执行此操作。

文件的格式如何?它们是以换行符分隔的,还是可能会在其中一个嵌套记录中出现换行符?这些文件是以换行符分隔的,我不希望在其中一个嵌套记录中出现任何换行符。我编辑了我的问题以包含一个示例。我使用谢谢你,最后我有很多朋友。
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);
    }
  });