【问题标题】:Is it possible to convert a generic record to specific record with the same schema?是否可以将通用记录转换为具有相同架构的特定记录?
【发布时间】:2019-01-17 00:28:55
【问题描述】:

我有一个模式 A 的 GenericRecord 对象,它也是一个生成的 Avro Java 类。我有可能以某种方式将此对象转换为实际的 A 类型吗?

【问题讨论】:

    标签: java avro


    【解决方案1】:

    您可以使用 deepCopy 将 Avro GenericRecord 转换为 SpecificRecord。例如,如果“Foo”是特定记录:

    Foo foo = (Foo) SpecificData.get().deepCopy(genericRecord.getSchema(), genericRecord)
    

    这假定与传递的架构对应的 SpecificRecord 类可用于 Avro。

    请注意,这种方法不支持模式演变:只有一个模式传递给deepCopy,它用于读取和写入。这意味着字段是根据其位置复制的,因此 SpecificRecord 架构必须与 GenericRecord 架构完全匹配。

    http://apache-avro.679487.n3.nabble.com/Direct-conversion-from-Generic-Record-to-Specific-Record-tp4029324p4029339.html

    【讨论】:

    • 反向操作对我不起作用..stackoverflow.com/questions/68877855/…
    • 我看不懂这段代码。 deepCopy之后还是genericrecord,specificRecord在哪里?
    • @LunaticJape 我已经更新了答案,希望现在更清楚。基本上,如果 Avro 找到与传递的 schema 对应的 SpecificRecord 类,它将实例化它并在 deepCopy 期间返回它。
    • 我收到了这个错误。 java.lang.ClassCastException:com.ReservationStatusReason 类无法转换为 org.apache.avro.generic.IndexedRecord 类(com.ReservationStatusReason 和 org.apache.avro.generic.IndexedRecord 位于加载程序“app”的未命名模块中)。我的一个依赖项中包含了我的具体类。
    • @LunaticJape 也许是模式不匹配?尝试将ReservationStatusReason.schema 作为第一个参数而不是genericRecord.schema 传递。还要检查genericRecord.schema.equals(ReservationStatusReason.schema).
    猜你喜欢
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 2014-03-02
    相关资源
    最近更新 更多