Apache Avro «гетерогенный массив»

Может кто-нибудь посоветует, пожалуйста, как использовать гетерогенные массивы в 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 в закодированный поток, но должен как-то указать, что это значение Union … не уверен, как это сделать.

Редактировать:

Я смог достичь того, что я хочу, напрямую кодируя элементы схемы:

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 до сих пор для меня загадка.

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector