Avro:创纪录的反序列化问题 [英] Avro: Record deserialization issue

查看:137
本文介绍了Avro:创纪录的反序列化问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个要从中读取属性的SpecificRecord对象。让我们假设我没有访问这个规范记录对象的生成类的权限(因为这些类是在运行时通过反射从类池中动态选择的)。每个生成的类都有一个公共属性&Extact_DT_TM&Quot;(以及它的一个getter方法),我希望能够从该SpecificRecord对象(这就是我遇到问题的对象)中读取该属性。

到目前为止,我已尝试:

    public String map(SpecificRecord record) {
        System.out.println("genericData to String = " + 
        GenericData.get().deepCopy(record.getSchema(), record).toString());
        GenericRecord genericRecord = (GenericRecord) 
        GenericData.get().deepCopy(record.getSchema(), record);
        System.out.println("genericRecord to String = " + genericRecord.toString());

        Long extractionTime = (Long) genericRecord.get("EXTRACT_DT_TM");

但我得到以下异常:

  2021-08-22 01:14:43,280 WARN [main] org.apache.hadoop.mapred.YarnChild: Exception running child : java.lang.ClassCastException: org.apache.avro.generic.GenericData$Record cannot be cast to org.apache.avro.specific.SpecificRecord
    at com.x.y.analytics.ods.z.ExtractionDatePartitionFn.map(ExtractionDatePartitionFn.java:49)
    at com.x.y.analytics.ods.wolfe.ExtractionDatePartitionFn.map(ExtractionDatePartitionFn.java:22)
    at org.apache.crunch.fn.ExtractKeyFn.map(ExtractKeyFn.java:64)
    at org.apache.crunch.fn.ExtractKeyFn.map(ExtractKeyFn.java:29)
    at org.apache.crunch.MapFn.process(MapFn.java:34)
正在寻找有关如何从规范记录中读取此值的任何想法。在上面的方法中,我尝试将SpecificRecord转换为GenericRecord,然后从其中读取值。

推荐答案

目前,由于该属性在所有生成的类中的位置是固定的,因此我能够使用以下内容。我仍然想知道,有没有人有更好的答案,而不是与指数捆绑在一起。

        Long extractionTime = (Long) record.get(2); // EXTRACT_DT_TM field

这篇关于Avro:创纪录的反序列化问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆