汇总kafka - java.io.IOException:org.apache.avro.AvroTypeException:...缺少必填字段

时间:2016-09-15 08:03:35

标签: hive avro

我正在使用confluent-3.0.1,并希望尝试Avro架构演变,但是当我尝试向后兼容hive时,似乎存在一些问题。

首先我声明了这个架构,查询了hive并获得了数据。

public static final String USER_SCHEMA = "{" +
        " \"namespace\": \"example.avro\",\n" +
        " \"type\": \"record\",\n" +
        " \"name\": \"user\",\n" +
        " \"fields\": [\n" +
        "     {\"name\": \"name\", \"type\": \"string\"},\n" +
        "     {\"name\": \"now\", \"type\": \"long\"},\n" +
        "     {\"name\": \"favorite_number\",  \"type\": \"int\"}" +
        " ]\n" +
        "}";

然后我在架构中添加了新的可选字段“a”

public static final String USER_SCHEMA = "{" +
        " \"namespace\": \"example.avro\",\n" +
        " \"type\": \"record\",\n" +
        " \"name\": \"user\",\n" +
        " \"fields\": [\n" +
        "     {\"name\": \"name\", \"type\": \"string\"},\n" +
        "     {\"name\": \"now\", \"type\": \"long\"},\n" +
        "     {\"name\": \"favorite_number\",  \"type\": \"int\"}" +
        "     ,\n{\"name\": \"a\", \"type\": [\"null\",\"string\"], \"default\": null}" +
        " ]\n" +
        "}";

但当我查询蜂巢时,我得到了这个例外:

“失败,异常java.io.IOException:org.apache.avro.AvroTypeException:找到example.avro.user,期望example.avro.user,缺少必填字段”

我认为它是由没有新字段的第一行引起的。 (在hadoop看起来很好看。)

它似乎只有空值的问题,因为如果我将此字段添加到模式我确实设法查询 添加新字段后的蜂巢。

public static final String USER_SCHEMA = "{" +
        " \"namespace\": \"example.avro\",\n" +
        " \"type\": \"record\",\n" +
        " \"name\": \"user\",\n" +
        " \"fields\": [\n" +
        "     {\"name\": \"name\", \"type\": \"string\"},\n" +
        "     {\"name\": \"now\", \"type\": \"long\"},\n" +
        "     {\"name\": \"favorite_number\",  \"type\": \"int\"}" +
        "     ,\n{\"name\": \"favorite_color\", \"type\": \"string\", \"default\": \"green\"}" +
        " ]\n" +
        "}";
你知道可能出现什么问题吗?

谢谢!

0 个答案:

没有答案