Как использовать общую запись в Avro (Java) с реальным массивом - PullRequest
0 голосов
/ 23 октября 2019

Тип массива avro использует следующий код внутри GenericDatumWriter

  protected long getArraySize(Object array) {
    return ((Collection) array).size();
  }

Итак, у меня есть реальный массив (довольно большой массив примитивных чисел с плавающей точкой). Я сделал наивное предположение, что массив avro, по крайней мере, разрешит хранение массивов, но из вышесказанного ясно, что он считается коллекцией. Я действительно не хочу оборачивать каждый элемент моего массива с плавающей точкой, так что я могу сделать? Я пытался найти решения, но, к сожалению, использование слова «массив» для универсального типа означает, что меня завалили ложные сведения. Спасибо

1 Ответ

0 голосов
/ 23 октября 2019

Итак, чтобы ответить на мой собственный вопрос - один из способов сделать это - преобразовать массив с плавающей точкой в ​​байтовый массив (или, точнее, байтовый буфер), используя тип данных «байты» в схеме. От моего писателя

    val bb = ByteBuffer.allocate(value.length * 4)
    value.indices.foreach { i => bb.putFloat(value(i))}
    bb.rewind()

и читателя

    case bb: ByteBuffer =>
      val flts = bb.asFloatBuffer()
      val lim = flts.limit()
      val out = Array.ofDim[Float](lim)
      0.until(lim).foreach( i => out(i) = flts.get(i))
      out
    }

Обратите внимание, я не мог найти способ избежать копий в каждом случае - asFloatBuffer не разрешает последующее .array наFloatBuffer

...