gpt4 book ai didi

flume - 生成具有可选值的 avro 模式

转载 作者:行者123 更新时间:2023-12-04 12:41:12 31 4
gpt4 key购买 nike

我正在尝试编写一个非常简单的 avro 模式(很简单,因为我只是指出我当前的问题)来根据以 json 格式存储的数据编写一个 avro 数据文件。诀窍是一个字段是可选的,而 avrotools 或我之一没有做对。

目标不是编写我自己的序列化程序,最终目标是将其放入水槽中,我处于早期阶段。

名为 so.log 的文件中的数据(有效):

{
"valid": {"boolean":true}
, "source": {"bytes":"live"}
}

模式,在一个名为 so.avsc 的文件中:
{
"type":"record",
"name":"Event",
"fields":[
{"name":"valid", "type": ["null", "boolean"],"default":null}
, {"name":"source","type": ["null", "bytes"],"default":null}
]
}

我可以使用以下命令轻松生成 avro 文件:
java -jar avro-tools-1.7.6.jar fromjson --schema-file so.avsc so.log

到现在为止还挺好。问题是“源”是可选的,所以我希望以下数据也有效:
{
"valid": {"boolean":true}
}

但是运行相同的命令给了我错误:
Exception in thread "main" org.apache.avro.AvroTypeException: Expected start-union. Got END_OBJECT
at org.apache.avro.io.JsonDecoder.error(JsonDecoder.java:697)
at org.apache.avro.io.JsonDecoder.readIndex(JsonDecoder.java:441)
at org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:229)
at org.apache.avro.io.parsing.Parser.advance(Parser.java:88)
at org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:206)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:155)
at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:193)
at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:183)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:151)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:142)
at org.apache.avro.tool.DataFileWriteTool.run(DataFileWriteTool.java:99)
at org.apache.avro.tool.Main.run(Main.java:84)
at org.apache.avro.tool.Main.main(Main.java:73)

我确实在架构中尝试了很多变体,即使是不遵循 avro 规范的东西。据我所知,我在这里展示的模式是规范所说的应该是什么。

有人会知道我做错了什么,以及如何在不编写自己的序列化程序的情况下实际拥有可选元素?

谢谢,

最佳答案

根据documentation的Java API:

using a builder requires setting all fields, even if they are null



python API ,另一方面,似乎允许空字段是真正可选的:

Since the field favorite_color has type ["string", "null"], we are not required to specify this field



简而言之,由于大多数工具都是用 Java 编写的,因此通常必须明确给出空字段。

关于flume - 生成具有可选值的 avro 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22939391/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com