Google cloud dataflow org.json.JSONObject的Apache Beam编码器

Google cloud dataflow org.json.JSONObject的Apache Beam编码器,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我正在用ApacheBeam编写一个数据管道,它读取Pub/Sub,将消息反序列化为JSONObject,并将它们传递给其他一些管道阶段。问题是,当我尝试提交代码时,出现以下错误: 执行Java类时发生异常。无法返回用于转换为JSON和模糊PII数据/ParMultiDo(JSONifyAndObfuscate)的默认编码器。输出[PCollection]。纠正以下根本原因之一: [错误]未手动指定编码器;可以使用.setCoder()执行此操作。 [错误]从CoderRegistry推断编码器

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

执行Java类时发生异常。无法返回用于转换为JSON和模糊PII数据/ParMultiDo(JSONifyAndObfuscate)的默认编码器。输出[PCollection]。纠正以下根本原因之一: [错误]未手动指定编码器;可以使用.setCoder()执行此操作。 [错误]从CoderRegistry推断编码器失败:无法为org.json.JSONObject提供编码器。 [错误]使用已注册的CoderProvider生成编码器失败。 [错误]有关详细故障,请参阅抑制的异常。 [错误]使用生成PTTransform的默认输出编码器失败:调用了PTTransform.getOutputCoder

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


谢谢

了解编码器的最佳起点在Beam编程指南中:。简短的版本是,编码器用于指定不同类型的数据如何在波束管道中的特定点(通常在阶段边界处)编码到字节字符串或从字节字符串编码到字节字符串。不幸的是,默认情况下没有JSONObject的编码器,因此这里有两个选项:

  • 避免在PCollections中创建JSONObject。您可以从JSON中提取所需的数据,并将其作为基本数据类型传递,或者使用自己的类封装所需的数据,而不是在整个管道中传递JSONObject。Java的基本数据类型都指定了默认的编码器,可以很容易地为这些类型的结构类生成编码器。作为一个附带的好处,这就是梁管道的预期构建方式,因此,如果您尽可能坚持使用基本数据和知名的编码器,它可能会工作得更好

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


  • 谢谢我通过扩展coder类并通过基本上将JSON对象转换为字符串来实现“encode”和“decode”两种方法,创建了一个定制的coder类。