当前位置: 首页 > 知识库问答 >
问题:

有没有一种方法可以在Java中区分两个Avro GenericRecords,从而只获取更改的字段和值?

曹沛
2023-03-14

我想写Java代码来区分保存在内存中的两个通用记录,它们都有相同的模式。我找不到任何库或任何ApacheAvroJavadoc来说明如何做到这一点。

我的愿望是尽可能高效,并将通用记录转换为JSON,然后区分它们,然后将JSON转换回通用记录将是不可取的,除非这是唯一的选择。

protected GenericRecord generateDeltaFieldsOnly(GenericRecord storedRecord, GenericRecord newRecord) 
{

    ObjectMapper objectMapper = new ObjectMapper();
    JsonNode storedRecordJson = objectMapper.readTree(storedRecord.toString());
    JsonNode newRecordJson = objectMapper.readTree(newRecord.toString());

}

共有1个答案

姬魁
2023-03-14

抱歉现在才看到这个...

只需将这两个字段都保留为genericords,并从模式中遍历字段即可更改所需的字段。我可以这样做,但是使用来自两个不同模式的genericords,并用关键字标记模式描述,这些关键字通知基本上愚蠢的转换器进行映射。

@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

}
 类似资料:
  • 问题内容: 有没有一种方法可以在Java中随机获取HashMap的值? 问题答案: 这有效: 如果您希望随机值不是类型,只需在最后一行添加强制类型转换即可。因此,如果声明为: 最后一行可以是: 下面的代码 无效 ,总是返回s 数组,不能将其强制转换为。

  • 我真的想知道是否有一种方法可以只从该方法获得另一个方法的值。因为在main方法中,第一个方法已经被调用,而第二个方法需要第一个方法输入的值。 静态int first_Method(int num){ //第二种方法 静态void second_method(){

  • 问题内容: 我正在编写小型且非常干燥的框架,该框架高度依赖元数据。我想知道是否有一种方法来获取方法参数名称,即给定一些方法 得到的字符串和。 我知道我可以注释参数,但是那不是很好。 问题答案: 我们为包含参数名称的String[]的方法创建了一个自定义注释。与必须注释每个单独的参数相比,此方法感觉易于管理。我们计划添加构建时检查,以确保带注释的参数名称的数量与参数的数量匹配,因为这是我们所需要的。

  • 问题内容: 假设我们有这个流 我想在地图中保存几对相邻的字符串,其中第一个以“ err”开头。 我想到的就是这样 但是我对它并不完全满意,主要有两个原因 我在“滥用” 功能。在Stream API中,每个函数都有其明确的定义明确的目的:应该计算最大值,应该根据条件进行过滤,应该产生递增的累加值,依此类推。 这样做会使我无法使用Streams强大的机制:如果我想将搜索范围限制在前两个结果中,该怎么办

  • 问题内容: 我有一个Jcheckbox,但只有勾号显示了它的选中状态,有没有一种方法可以将其更改为十字形或圆形?并且有一种方法可以将灰色背景更改为白色,setBackground似乎没有什么不同? 问题答案: 用户setPressedIcon,setIcon和setDisabledIcon

  • 我需要写一个私人的方法在java接收2数组。有没有办法使他们必须是相同的长度? 比如: 公共静态无效方法(int[]arr1,int[]arr2[arr1.length])