在数据流 2.x 中将 TableRow 转换为 JSON 格式字符串的最简单方法?

Posted

技术标签:

【中文标题】在数据流 2.x 中将 TableRow 转换为 JSON 格式字符串的最简单方法?【英文标题】:Easiest way to convert a TableRow to JSON-formatted String, in dataflow 2.x? 【发布时间】:2018-06-12 14:40:41 【问题描述】:

没有编写自己的函数来完成它,将数据流 2.x 管道内的 TableRow 对象转换为 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());
    
  

【问题讨论】:

【参考方案1】:

使用GSON 并做一个gson.toJson(yourTableRow) 详细信息here

【讨论】:

【参考方案2】:

我遇到了同样的问题,我用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 管理您的项目,您可以将其添加到 pom.xml 文件中的 &lt;dependencies&gt;

<dependency>
  <groupId>org.apache.beam</groupId>
  <artifactId>beam-sdks-java-extensions-json-jackson</artifactId>
  <version>2.5.0</version>
  <scope>compile</scope>
</dependency>

【讨论】:

这很有趣。我想知道 AsJsons 的效率是多少?但是比较起来,我们发现 Gson 使用起来非常昂贵;此时,我们尝试在单元测试中专门使用它来将 JSON 字符串转换为对象以用作输入。 我正在运行包含 100 个 TableRows 和大约 20 列的示例,所以我现在不能对效率说太多。 关于效率的更新:我对 142,515,724 个 TableRows 运行了 Json 转换,并且在数据流上花费了 14 分 22 秒 AsJsons 转换的返回值是多少?是不是像PCollection&lt;what??&gt; @bigbounty 查看文档,AsJsons.of 返回一个 PCollection&lt;ObjectMapper&gt; 创建一个 AsJsons PTransform,它将一个 PCollection 转换为 JSON 字符串的 PCollection,使用 Jackson 表示这些对象对象映射器。 beam.apache.org/releases/javadoc/2.0.0/org/apache/beam/sdk/…

以上是关于在数据流 2.x 中将 TableRow 转换为 JSON 格式字符串的最简单方法?的主要内容,如果未能解决你的问题,请参考以下文章

在sql server中将数据和时间转换为数字

在javascript中将图像转换为二进制数据[重复]

如何在火花中将数据帧转换为csv [重复]

如何在 Swift 中将 CMSampleBuffer 转换为数据?

如何在火花中将rdd对象转换为数据框

在 Pandas 中将每日数据转换为每周数据