Google cloud dataflow apachebeam和avro:创建一个没有模式的数据流管道

Google cloud dataflow apachebeam和avro:创建一个没有模式的数据流管道,google-cloud-dataflow,avro,apache-beam,Google Cloud Dataflow,Avro,Apache Beam,我正在用apachebeam构建一个数据流管道。下面是伪代码: PCollection rows=pipeline.applyRead来自PubSub的Json, .applyConvert Json到pojo,ParDo.ofnew JsonToPojo 。将转换pojo应用于新POJOTOGENERICROCORD ParDo的总记录 .setcoderavocoder.ofgenericord.class,schema; 我试图摆脱在管道中设置编码器的做法,因为在管道创建时,模式将不为人所

我正在用apachebeam构建一个数据流管道。下面是伪代码:

PCollection rows=pipeline.applyRead来自PubSub的Json, .applyConvert Json到pojo,ParDo.ofnew JsonToPojo 。将转换pojo应用于新POJOTOGENERICROCORD ParDo的总记录 .setcoderavocoder.ofgenericord.class,schema; 我试图摆脱在管道中设置编码器的做法,因为在管道创建时,模式将不为人所知,它将出现在消息中

我注释掉了设置编码器的行,得到了一个异常,表示没有配置默认编码器。我使用了方法的一个参数版本,得到了以下异常:

非特定类:interface org.apache.avro.generic.GenericRecord 位于org.apache.avro.specific.SpecificData.createSchemaSpecificData.java:285 位于org.apache.avro.reflect.ReflectData.createSchemaReflectData.java:594 在org.apache.avro.specific.SpecificData$2.loadSpecificData.java:218 位于org.apache.avro.specific.SpecificData$2.loadSpecificData.java:215 在avro.shade.com.google.common.cache.LocalCache$LoadingValueReference.loadFutureLocalCache.java:3568 在avro.shade.com.google.common.cache.LocalCache$Segment.loadSyncLocalCache.java:2350 在avro.shade.com.google.common.cache.LocalCache$Segment.lockedGetOrLoadLocalCache.java:2313 在avro.shade.com.google.common.cache.LocalCache$Segment.getLocalCache.java:2228 ... 9更多
我们有没有办法在不事先知道模式的情况下在运行时提供编码器?

这是可能的。我建议采取以下办法:

不要使用GenericRecord类型的中间集合。将其作为您的POJO收藏。 编写一些转换来提取数据的模式,并使其作为PCollectionView可用。 在写入BigQuery时,请通过write.toDynamicDestinations写入您的PCollection;在写入Avro时,请将FileIO.write或writeDynamic与AvroIO.sinkViaGenericRecords结合使用。这两种方法都可以从上面计算的侧输入中获取动态计算的模式。
这条管道对总司令部的下游有什么作用?可以不使用GenericRecord吗?@jkff它将GenericRecord转换为TableRow并写入BigQuery。它还使用AvroIO写入文件系统,这是我面临的另一个问题,因为AvroIO也需要模式。您希望Bigquery表和生成的Avro文件具有什么模式?听起来你在用许多不同的模式编写记录,所以我想它们必须进入不同的表和文件?@jkff我们使用模式演化,以便两个模式都符合相同的BigQuery表。只是一个模式会有额外的字段,而另一个不会。我们将为这些字段插入空值。嘿@jkff,谢谢你的回复。有几个问题:1。我们已经使用POJO的PCollection实现了对BigQuery的写入,并且似乎工作得很好。2.关于文件写入,您能否提供如何使用AvroIO将PCollection写入GCS的伪代码?我们尝试探索FileIO和TextIO,但无法找出write或writeDynamic方法的帮助。AvroIO需要PCollection才能写入,除非我们对需要编码器的PCollection应用转换,否则我们无法使用它。特别是一个伪代码,解释如何使用PCollection和PCollectionView以及AvroIO将文档写入动态目标,这将非常好。您需要Beam 2.3.0或更高版本,然后您可以将FileIO.write/writeDynamic与AvroIO.sink一起使用-请参阅AvroIO单元测试中的一个示例