提问者:小点点

org. json.JSONObject的Apache光束编码器


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

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

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

谢谢!


共1个答案

匿名用户

了解编码器的最佳起点是在《Beam编程指南:数据编码和类型安全》中。简短的版本是编码器用于指定不同类型的数据如何在Beam管道中的某些点(通常是阶段边界)与字节字符串之间进行编码。不幸的是,默认情况下没有JSONObject的编码器,因此您在这里有两个选项:

>

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

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