【问题标题】:Is it possible to pass different subclasses to the same PCollection?是否可以将不同的子类传递给同一个 PCollection?
【发布时间】:2018-03-21 15:37:57
【问题描述】:

是否有可能在 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 编程问题和对该语言的理解不足。

【问题讨论】:

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


    【解决方案1】:

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

    您的 DoFns 下游将接收超类对象,您需要向下转换为适当的子类。

    【讨论】:

    • 啊好吧!你能指出一个以这种方式使用 Coders 的例子吗?我不确定如果将它们都捆绑在同一个 PCollection 中,您不知道哪个父级来自哪个子级,那么向下转换会如何工作。
    • 为了区分代码中的对象可以使用instanceof来判断你有哪个子类。
    • 当然!我现在正在使用 AvroCoder。会考虑你的建议。谢谢!
    猜你喜欢
    • 2020-01-02
    • 2019-08-28
    • 2018-03-26
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    相关资源
    最近更新 更多