【问题标题】:Avro append generic record with non-existent schema fieldAvro 使用不存在的架构字段附加通用记录
【发布时间】:2017-02-20 12:55:01
【问题描述】:

我有以下架构

{"namespace": "POS.avro",
 "type": "record",
 "name": "POS",
 "fields": [
     {"name": "TransactionID", "type": "int"},
     {"name": "Date", "type": "long"},
     {"name": "Invoice", "type": "string"},
     {"name": "StoreId", "type": "string"},
     {"name": "StoreName", "type": "string"},
     {"name": "SalesMan", "type": "string"},
  ]
}

我正在用 Java 创建通用记录以将其附加到 Avro 文件中

    DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<GenericRecord>(schema);
    File avroFile = new File(avroFileName);

    DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<GenericRecord>(datumWriter);
    dataFileWriter.create(schema, avroFile);

    // Instantiating the GenericRecord class.
    GenericRecord salesRecord = new GenericData.Record(schema);

    String key = "Product Name";
    Field field = schema.getField(key);
    if (field == null) {
        salesRecord.put(key, "some value");
    }

    dataFileWriter.append(salesRecord);

我正在尝试用一些值附加不存在的字段,但得到 AvroRuntimeException。

我们可以附加不存在的字段吗?如果是,使用 Java 附加此类字段的方法是什么?

【问题讨论】:

    标签: java avro


    【解决方案1】:

    如果 schema 中没有字段,则不能在 genericRecord 中放置任何键值。

    这是 put 方法的工作原理:

    public void put(String key, Object value) {
        Field field = this.schema.getField(key);
        if(field == null) {
            throw new AvroRuntimeException("Not a valid schema field: " + key);
        } else {
            this.values[field.pos()] = value;
        }
    }
    

    PS。您确定您的架构有效吗? {"name": "SalesMan", "type": "string"}, 行中有多余的逗号

    【讨论】:

      猜你喜欢
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 2015-09-09
      相关资源
      最近更新 更多