【问题标题】:Avro genericdata.Record ignores data typesAvro genericdata.Record 忽略数据类型
【发布时间】:2015-09-25 15:32:04
【问题描述】:

我有以下 avro 架构

{ "namespace": "example.avro",
  "type": "record",
  "name": "User",
  "fields": [
            {"name": "name", "type": "string"},
            {"name": "favorite_number",  "type": ["int", "null"]},
            {"name": "favorite_color", "type": ["string", "null"]}
            ]
 }

我用下面的sn-p来设置一个Record

val schema = new Schema.Parser().parse(new File("data/user.avsc"))
val user1 = new GenericData.Record(schema)  //strangely this schema only checks for valid fields NOT types.
user1.put("name", "Fred")
user1.put("favorite_number", "Jones")

我原以为这将无法针对架构进行验证

当我添加行时

user1.put("last_name", 100)

它会产生一个运行时错误,这也是我在第一种情况下所期望的。

线程“主”org.apache.avro.AvroRuntimeException 中的异常:不是有效的架构字段:last_name 在 org.apache.avro.generic.GenericData$Record.put(GenericData.java:125) 在 csv2avro$.main(csv2avro.scala:40) 在 csv2avro.main(csv2avro.scala)

这是怎么回事?

【问题讨论】:

  • Avro 仅在尝试序列化记录时检查类型和字段名称。在您的情况下,架构中未声明 last_name。

标签: scala hadoop record avro


【解决方案1】:

将它添加到 Record 时不会失败,当它尝试序列化时它会失败,因为它正在尝试匹配类型。据我所知,这是它进行类型检查的唯一地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 2019-07-02
    • 1970-01-01
    • 2016-07-17
    • 2021-03-07
    • 2021-11-29
    相关资源
    最近更新 更多