java.lang.IllegalStateException:无法返回dataflow 2.X中的默认编码器

java.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:无法返

我在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:无法返回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
中的对象的类中,即将其添加到描述正在序列化/反序列化的实体的任何类中