有没有办法对Java中的两个Avro GenericRecords进行比较,以仅获取已更改的字段和值?

时间:2019-05-30 12:25:27

标签: json avro

我想编写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());

}

1 个答案:

答案 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

}