Avro SpecificRecord无对应生成类时读取EXTRACT_DT_TM属性报错如何处理
解决方案
方案1:通过Schema索引读取字段(推荐)
SpecificRecord 实现了 IndexedRecord 接口,不需要转换为GenericRecord,直接结合Schema即可读取目标字段,无额外对象拷贝开销,性能最优:
public String map(SpecificRecord record) { // 先获取EXTRACT_DT_TM字段在Schema中的位置 int extractDtTmPos = record.getSchema().getField("EXTRACT_DT_TM").pos(); // 按索引读取字段值 Long extractionTime = (Long) record.get(extractDtTmPos); // 后续业务逻辑 }
只要对应的Schema中存在EXTRACT_DT_TM字段,该方法就能正常执行,不需要依赖具体的生成类。
方案2:反射调用Getter方法
如果所有生成类都明确包含EXTRACT_DT_TM的公共Getter方法,也可以通过反射调用实现读取,兼容性更强:
// 可以把Method对象缓存起来,避免每次反射获取提升性能 private static final Method GET_EXTRACT_DT_TM; static { try { GET_EXTRACT_DT_TM = SpecificRecord.class.getMethod("getEXTRACT_DT_TM"); } catch (NoSuchMethodException e) { throw new RuntimeException(e); } } public String map(SpecificRecord record) throws Exception { Long extractionTime = (Long) GET_EXTRACT_DT_TM.invoke(record); // 后续业务逻辑 }
原报错原因说明
你遇到的ClassCastException和你贴出的代码逻辑不匹配,报错提示是尝试将GenericData$Record转为SpecificRecord,说明实际运行的代码中存在把深拷贝返回的GenericRecord对象赋值给SpecificRecord类型变量的错误逻辑,删除多余的深拷贝和类型转换操作即可解决该异常。
内容的提问来源于stack exchange,提问作者Rookie
相关产品推荐
相关产品推荐

