我在
data_avro.json
文件中有以下 avro 架构定义:
[
{
"namespace": "my.data",
"type": "record",
"name": "Data1",
"fields" : [
{"name": "i", "type": "int"}
]
},
{
"namespace": "my.data",
"type": "record",
"name": "Data2",
"fields" : [
{"name": "u", "type": "double"},
{"name": "val", "type": "int"}
]
}
]
现在,我正在尝试像这样编码数据:
avrodata::Data1 data1;
data1.i = 1;
avrodata::Data2 data2;
data2.val = 0;
data2.u = 2.5;
std::ifstream ifs("data_avro.json");
avro::ValidSchema schemas;
std::string err;
if (!avro::compileJsonSchema(ifs, schemas, err))
std::cerr << "compileJsonSchema error : " << err << std::endl;
else
std::cout << "compileJsonSchema success" << std::endl;
auto encoder = avro::jsonEncoder(schemas);
auto out = avro::memoryOutputStream();
encoder->init(*out);
avro::encode(*encoder, data1); // avro::Exception is thrown here
但是有错误,输出是:
compileJsonSchema success
terminate called after throwing an instance of 'avro::Exception'
what(): Invalid operation. Expected: Int got Union
然而,avro::binaryEncoder
似乎比 avro::jsonEncoder
工作得更好。
如何使用 avro::jsonEncoder
来编码这些数据?
谢谢你。
正如我在评论中提到的,我曾经/正在面临与您相同(或至少相似)的问题。即使这可能无法解决您的问题,它至少应该提供一些清晰的信息。
正如我所怀疑的,问题在于你的
data_avro.json
。 (旁注:看起来约定是使用 .avsc
文件扩展名而不是 avro schemas 的
.json
)。
为了使
jsonEncoder
正常工作,您使用的架构不得被 [ ... ]
包围。更准确地说,您的架构似乎必须是单个 record
,在顶层由一对 { ... }
包围。
我最初也有一个
.avsc
,其中 [ ... ]
位于顶层,以便能够重用 record
并避免复制粘贴错误...一旦我愚蠢地将所有记录粘贴到一个单一的、巨大的记录中,就我而言,jsonPrettyEncoder
效果很好。
对于您来说,这意味着您需要将模式拆分为 2 个文件,如下所示:
// Data1.avsc:
{
"namespace": "my.data",
"type": "record",
"name": "Data1",
"fields" : [
{"name": "i", "type": "int"}
]
}
// Data2.avsc:
{
"namespace": "my.data",
"type": "record",
"name": "Data2",
"fields" : [
{"name": "u", "type": "double"},
{"name": "val", "type": "int"}
]
}