我在dataflow 2.1 sdk中有一个简单的管道。从pubsub读取数据然后将DoFn应用于它。
PCollection<MyClass> e = streamData.apply("ToE", ParDo.of(new MyDoFNClass()));
在此管道上获得以下错误:
java.lang.IllegalStateException:无法返回ToEvents / ParMultiDo(MyDoFNClass).out0 [PCollection]的默认编码器。更正以下根本原因之一: 没有手动指定编码器;你可以使用.setCoder()来完成。 从CoderRegistry推断编码器失败:无法为com.X.X.model.MyClass提供编码器。
MyDoFn课程如下:
@DefaultCoder(AvroCoder.class)
public class MyClass{
public long id;
public HashMap<String,HashSet<String>> a;
@SerializedName("a")
public Integer Id;
@SerializedName("ae")
public String ae;
}
答案 0 :(得分:9)
找到解决方案只需将implements Serializable
添加到MyClass
@DefaultCoder(AvroCoder.class)
public class MyClass implements Serializable {
public long id;
public HashMap<String,HashSet<String>> a;
@SerializedName("a")
public Integer Id;
@SerializedName("ae")
public String ae;
}
答案 1 :(得分:0)
以下是Beam编程指南中有关编码器的一些文档
Beam SDK对于管道中的每个PCollection都需要一个编码器。在大多数情况下,Beam SDK能够根据其元素类型或生成它的转换自动为PCollection推断一个编码器,但是,在某些情况下,管道作者将需要显式指定编码器,或为他们的自定义类型。
每个管道对象都有一个CoderRegistry对象,该对象将语言类型映射到管道应用于这些类型的默认编码器。您可以自己使用CoderRegistry查找给定类型的默认编码器,或注册给定类型的新默认编码器。
转到下面的链接以查看光束库使用的默认编码器- https://beam.apache.org/documentation/programming-guide/#default-coders-and-the-coderregistry
如果您在pCollections中使用的对象不在默认编码器之内,则可能必须为该对象提供自定义编码器。 例如如果您查看PubsubIO.write()/ PubsubIO.read()方法的实现,则它们使用自定义编码器。例如PubsubMessagePayloadOnlyCoder
假设您正在将字符串转换为Pubsub消息。您可以将此编码器提供给您的pcollection。
PCollection<PubsubMessage> pubsubMessagePCollection = pCollectionTuple.get(accountId);
pubsubMessagePCollection.setCoder(PubsubMessagePayloadOnlyCoder.of());