我想编写Java代码来比较保存在内存中的两个GenericRecords,它们都具有相同的架构。我一直找不到有关如何执行此操作的任何库或任何Apache Avro Javadoc。
我希望尽可能高效,将GenericRecords转换为JSON,然后对其进行区分,然后再将JSON转换回GenericRecord,除非那是唯一的选择。
protected GenericRecord generateDeltaFieldsOnly(GenericRecord storedRecord, GenericRecord newRecord)
{
ObjectMapper objectMapper = new ObjectMapper();
JsonNode storedRecordJson = objectMapper.readTree(storedRecord.toString());
JsonNode newRecordJson = objectMapper.readTree(newRecord.toString());
}
答案 0 :(得分:0)
很抱歉,现在才看到这个...
只需将它们都保留为genericRecords,就可以从架构中循环访问更改您想要的字段。我有点这样做,但是使用来自两个不同架构的genericRecords,并使用关键字标记架构描述,这些关键字通知基本笨拙的转换器进行映射。
@Override
public GenericRecord transform(GenericRecord source, GenericRecord reference) {
GenericRecordBuilder builder = new GenericRecordBuilder(targetSchema);
buildGenericRecord(builder, source);
buildGenericRecord(builder, reference);
return builder.build();
}
private void buildGenericRecord(GenericRecordBuilder builder, GenericRecord genericRecord) {
String fullName = genericRecord.getSchema().getFullName();
String targetField;
for (Entry<String, String> entry : fromFieldToField.entrySet()) {
if (entry.getKey().startsWith(fullName)) {
targetField = entry.getKey().substring(entry.getKey().lastIndexOf('.') + 1);
builder.set(entry.getValue(), genericRecord.get(targetField));
}
}
}
对于您来说,如果使用相同的架构,则容易得多。
for (Field field : storedRecord.getSchema().getFields()) {
//do your mapping field to field
}