我正在迁移一个自定义接收器,将FileBasedSink从2.0.0版扩展到2.2.0版。该类已更改并添加了两个额外的类型参数:UserT
和DestinationT
:
@Experimental(value=FILESYSTEM)
public abstract class FileBasedSink<UserT,DestinationT,OutputT>
extends java.lang.Object
implements java.io.Serializable, HasDisplayData
我查看了FileBasedSink的文档,但找不到它的目的。
在所有类型参数中,只有OutputT
有文档:
* @param <OutputT> the type of values written to the sink.`
答案 0 :(得分:1)
请注意,此API为being redesigned,将在下一版本的Beam中弃用。但是,同时:
UserT
是要写入的PCollection元素的类型 - WriteFiles
转换适用于PCollection<UserT>
。OutputT
是将直接传递到接收器Writer
的低级记录类型。它与UserT
不同,因为有些接收器具有“格式功能”,例如Avro可以将任何记录转换为GenericRecord
。 UserT
通过OutputT
映射到DynamicDestinations.formatRecord
。DestinationT
是用于支持同时写入多个目的地的逻辑类型,例如将不同类型的事件写入不同目录中具有不同模式的Avro文件。 DestinationT
用作要写入的记录的分组键,并且使用相同的配置写入具有相同DestinationT
的记录。请参阅FileBasedSink.DynamicDestinations
:getDestination
从UserT
记录中提取目的地,并且一系列其他方法会生成给定目的地的配置,例如DynamicAvroDestinations.getSchema
。此API不是最佳的 - 例如它将这些高级概念(用户类型和目标)引入特定于文件格式的代码(例如,写入Avro文件)。这就是重新设计的原因。请继续关注实施新API的PR https://github.com/apache/beam/pull/3817。