java.lang.IllegalStateException:无法返回dataflow 2.X中的默认编码器
我在Dataflow2.1SDK中有一个简单的管道。从pubsub读取数据,然后对其应用DoFnjava.lang.IllegalStateException:无法返回dataflow 2.X中的默认编码器,java,google-cloud-dataflow,apache-beam,Java,Google Cloud Dataflow,Apache Beam,我在Dataflow2.1SDK中有一个简单的管道。从pubsub读取数据,然后对其应用DoFn PCollection<MyClass> e = streamData.apply("ToE", ParDo.of(new MyDoFNClass())); PCollection e=streamData.apply(“ToE”,ParDo.of(new MyDoFNClass()); 获取此管道上的以下错误: java.lang.IllegalStateException:无法返
PCollection<MyClass> e = streamData.apply("ToE", ParDo.of(new MyDoFNClass()));
PCollection e=streamData.apply(“ToE”,ParDo.of(new MyDoFNClass());
获取此管道上的以下错误:
java.lang.IllegalStateException:无法返回ToEvents/Parmulido(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;
}
@DefaultCoder(AvroCoder.class)
公共类MyClass{
公共长id;
公共哈希图a;
@序列化名称(“a”)
公共整数Id;
@序列化名称(“ae”)
公共字符串ae;
}
找到了需要将实现可序列化的添加到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;
}
@DefaultCoder(AvroCoder.class)
公共类MyClass实现可序列化{
公共长id;
公共哈希图a;
@序列化名称(“a”)
公共整数Id;
@序列化名称(“ae”)
公共字符串ae;
}
以下是《光束编程指南》中关于编码器的一些文档
Beam SDK需要为管道中的每个PCollection配备一个编码器。在大多数情况下,Beam SDK能够根据PCollection的元素类型或生成PCollection的转换自动推断PCollection的编码器,但是,在某些情况下,管道作者需要明确指定编码器,或者为其自定义类型开发编码器
每个管道对象都有一个CoderRegistry对象,它将语言类型映射到管道应用于这些类型的默认编码器。您可以使用CoderRegistry自己查找给定类型的默认编码器,或为给定类型注册新的默认编码器
转到下面的链接以查看beam库使用的默认编码器-
如果在pCollections中使用的对象不在默认编码器内,则可能必须为该对象提供自定义编码器。
例如,如果您查看PubsubIO.write()/PubsubIO.read()方法的实现,它们使用自定义编码器。e、 g.PubSubMessagePayloadOnly编码器
假设您正在将字符串转换为Pubsub消息。您可以将此编码器提供给您的pcollection
PCollection<PubsubMessage> pubsubMessagePCollection = pCollectionTuple.get(accountId);
pubsubMessagePCollection.setCoder(PubsubMessagePayloadOnlyCoder.of());
PCollection pubsubessagepcollection=pCollectionTuple.get(accountId);
setCoder(PubsubMessagePayloadOnlyCoder.of());
1)MyDofClass看起来像什么?2) 或者,您是否尝试过如消息所示使用.setCoder()手动指定编码器?为了澄清-对于此错误,请将implements Serializable
添加到定义存储在PCollection
中的对象的类中,即将其添加到描述正在序列化/反序列化的实体的任何类中