【问题标题】:Apache Beam Coder for org.json.JSONObject用于 org.json.JSONObject 的 Apache Beam 编码器
【发布时间】:2020-04-04 03:57:36
【问题描述】:

我正在 Apache Beam 中编写一个从 Pub/Sub 读取的数据管道,将消息反序列化为 JSONObjects 并将它们传递给其他一些管道阶段。问题是,当我尝试提交代码时,出现以下错误:

执行 Java 类时发生异常。无法返回默认编码器以转换为 JSON 并混淆 PII 数据/ParMultiDo(JSONifyAndObfuscate).output [PCollection]。纠正以下根本原因之一: [错误] 没有手动指定编码器;您可以使用 .setCoder() 来执行此操作。 [错误] 从 CoderRegistry 推断编码器失败:无法为 org.json.JSONObject 提供编码器。 [错误] 使用已注册的 CoderProvider 构建 Coder 失败。 [错误] 查看抑制的异常以了解详细的失败。 [错误] 使用生成 PTransform 的默认输出编码器失败:调用了 PTransform.getOutputCoder。

基本上错误说 Beam 找不到 org.json.JSONObject 对象的编码器。我不知道从哪里可以得到这样的编码器或如何构建一个。有什么想法吗?

谢谢!

【问题讨论】:

    标签: google-cloud-dataflow apache-beam


    【解决方案1】:

    了解编码器的最佳起点是 Beam 编程指南:Data Encoding and Type Safety。简短的版本是编码器用于指定如何在 Beam 管道中的某些点(通常在阶段边界)将不同类型的数据编码到字节串和从字节串编码。不幸的是,默认情况下没有 JSONObjects 编码器,因此您有两个选择:

    1. 避免在 PCollections 中创建 JSONObject。您可以从 JSON 中提取所需数据并将其作为基本数据类型传递,或者让您自己的类封装您需要的数据,而不是在整个管道中传递 JSONObjects。 Java 的基本数据类型都分配了默认编码器,并且可以轻松地为那些只是这些类型的结构的类生成编码器。附带的好处是,预计 Beam 管道将采用这种方式构建,因此如果您尽可能坚持使用基本数据和知名编码器,它可能会更有效地工作。

    2. 如果需要 JSONObject,您需要为它们创建自定义编码器。编程指南包含有关如何将自定义编码器设置为默认编码器的信息。对于实现本身,使用 JSONObject 最简单的方法是使用 JSONObject.toString 将其编码为 JSON 字符串,然后使用 JSONObject 的字符串构造函数将其从字符串中解码。有关如何执行此操作的详细信息,请查看上面的编程指南并查看Coder documentation

    【讨论】:

    • 谢谢!我通过扩展 Coder 类创建了一个自定义编码器类,并通过基本上将 JSON 对象转换为字符串来实现“编码”和“解码”这两种方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多