是否可以将不同的子类传递给同一个PCollection?

时间:2018-03-21 15:37:57

标签: java google-cloud-dataflow apache-beam dataflow

是否可以在Beam中使用PCollection“保存”同一超类的不同对象,以便

PCollection<T extends SuperClass> result =  input.apply(ParDo.of(new DoFnThatReturnsSubClasses()));

而不是

PCollection<SubClassA> A = input.apply(ParDo.of(new DoFnSubClassesA()));
PCollection<SubClassB> B = input.apply(ParDo.of(new DoFnSubClassesB()));

我的超类拥有以下基本字段

public class SuperClass {

String key; 
Long timestamp;

}

但是我的子类将包含一个额外的字段,它具有不同数据类型的相同变量名。即

public class SubClassA extends SuperClass {   
    List<HashMap<String, String>> value = new ArrayList<>();       
}

另一个子类

public class SubClassB extends SuperClass {   
    String value;       
}

我真正想要实现的是允许字段value具有不同的数据类型。我唯一能想到的就是把它分成不同的子类。我意识到这可能更像是一个Java编程问题,而且对语言的理解也很差。

1 个答案:

答案 0 :(得分:2)

是的,这是可能的。您可以拥有一个包含SubclassX对象混合的PCollection。您需要确保您用于PCollection的编码器可以编码和解码所有可能的子类。

您的下游DoFns将接收超类对象,您需要向下转换到相应的子类。