За исключением написания моей собственной функции для этого, каков самый простой способ преобразовать объект TableRow внутри конвейера потока данных 2.x в строку в формате JSON?

Я думал, что приведенный ниже код будет работать, но он неправильно вставляет кавычки между ключами / значениями, особенно там, где есть вложенные поля.

public static class TableRowToString extends DoFn<TableRow, String> {    
  private static final long serialVersionUID = 1L;

  @ProcessElement
    public void processElement(ProcessContext c) {
      c.output(c.element().toString());
    }
  }
}
3
Max 3 Янв 2018 в 01:20

2 ответа

Лучший ответ

Используйте GSON и выполните gson.toJson(yourTableRow) подробности здесь

4
PUG 26 Фев 2018 в 23:41

Я столкнулся с той же проблемой, которую решил с помощью org.apache.beam.sdk.extensions.jackson.AsJsons.

Чтобы использовать его, необязательно создавать новое преобразование, вы можете применить его непосредственно к конвейеру.

import org.apache.beam.sdk.extensions.jackson.AsJsons;

Pipeline p = Pipeline.create(options);

p.apply("The transform that returns a PCollection of TableRow")
.apply("JSon Transform", AsJsons.of(TableRow.class));

И если вы управляете своим проектом с помощью maven, вы можете добавить это в <dependencies> в файле pom.xml

<dependency>
  <groupId>org.apache.beam</groupId>
  <artifactId>beam-sdks-java-extensions-json-jackson</artifactId>
  <version>2.5.0</version>
  <scope>compile</scope>
</dependency>
3
Rafael Alves 17 Окт 2018 в 19:28