Apache Avro"异构阵列"

时间:2015-07-26 05:35:23

标签: c++ arrays avro heterogeneous

有人可以建议如何在Avro中使用异构数组(如果可能的话)。无法弄清楚诀窍是什么。

我的架构是:

{
  "type": "array", "items": ["null", "string"]
}

我没有使用生成的标头,只是尝试在代码中完成所有操作:

avro::ValidSchema schema;
avro::compileJsonSchema(ifs, schema);

avro::EncoderPtr e = avro::binaryEncoder();
avro::DecoderPtr d = avro::binaryDecoder();

avro::GenericDatum datum(schema);
avro::GenericArray& array = datum.value<avro::GenericArray>();

array.value().push_back(avro::GenericDatum(std::string("lala")));

std::auto_ptr<avro::OutputStream> out = avro::memoryOutputStream();
e->init(*out);
avro::encode(*e, datum);

std::auto_ptr<avro::InputStream> in = avro::memoryInputStream(*out);
d->init(*in);

avro::GenericDatum ddatum(schema);
avro::decode(*d, ddatum);

这引发了例外:

Exception: vector::_M_range_check: __n (which is 4) >= this->size() (which is 2)

我假设我正在将GenericDatum推送到编码流中,但应该以某种方式指定这是一个联盟的值..不知道该怎么做。

编辑:

我能够通过直接编码模式的元素来实现我想要的东西:

std::auto_ptr<avro::OutputStream> out = avro::memoryOutputStream();
e->init(*out);

e->arrayStart();
e->setItemCount(COLS);
char buf[10];
for(int j=0; j < COLS; ++j){
    .....
    e->encodeUnionIndex(1);
    e->encodeString(std::string(buf));
}
e->arrayEnd();
e->flush();

然而,如果有办法通过GenericDatum做到这一点对我来说仍然是一个谜。

0 个答案:

没有答案