【问题标题】:Subclassing Avro record?子类化 Avro 记录?
【发布时间】:2014-01-28 13:42:31
【问题描述】:

我有两种类型的 AvroRecord,它们都扩展了 avro.SpecificRecord。有没有办法在Java中使一个成为另一个的子类?其中之一是 PersonRecord,而我想成为它的子类的是 EmployeeRecord。我不想用 avro 数据填充普通 Java 类的原因是我正在使用 hadoop,如果可能的话,我想直接使用 avro 文件。

澄清一下,我感兴趣的是多态性。我希望能够使用一个函数,该函数将 PersonRecord 和 EmployeeRecord 作为参数。

谢谢!

【问题讨论】:

    标签: oop serialization hadoop avro


    【解决方案1】:

    我想我理解您想要做什么(在 Avro 架构定义文件中“子类化”一条 Avro 记录),但我认为这不可能。

    相反,一种方法是让EmployeeRecord 在其中嵌套一个PersonRecord 成员,然后是特定于员工的相关信息。例如:

    { 
      "type": "record",
      "name": "PersonRecord",
      "namespace": "com.yourapp",
      "fields": [
        {
          "name": "first",
          "type": "string"
        },
        { etc... }
        ]
    }
    
    
    { 
      "type": "record",
      "name": "EmployeeRecord",
      "namespace": "com.yourapp",
      "fields": [
        {
          "name": "PersonInfo",
          "type": "PersonRecord"
        },
        { 
          "name": "salary",
          "type": "int"
         },
        { etc... }
        ]
    }
    

    【讨论】:

    • 谢谢。从模式本身子类化 avro 记录似乎确实是不可能的。尽管按照您的建议,我们仍然无法将 EmployeeRecord 用作 PersonRecord。这是我想要的多态性。即,可以应用于employeeRecord 参数的函数(personRecord)。我最终手动向生成的 java 类(来自 avro)添加了一个接口,它可以工作——现在我编写了函数(接口)类型的函数并添加了一些单元测试来提醒其他开发人员添加这个接口,因为 avro 工具赢了不。仍在寻找更好的解决方案:)
    • 您可以使用 Avro Java API 执行此操作 - 特别是 Generic/SpecificData 的induction() 方法,以创建子类 Avro 模式 - 但这样做会失去独立于代码维护您的架构。
    猜你喜欢
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 2015-05-01
    相关资源
    最近更新 更多