首页 > 解决方案 > 如何在带有实际数组的 avro (java) 中使用通用记录

问题描述

avro 类型“array”在 GenericDatumWriter 中使用以下代码

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

所以我有一个真正的数组(相当大的原始浮点数组)。我做了一个天真的假设,即 avro 数组至少允许存储数组,但从上面来看,很明显,它被假定为一个集合。我真的不想到处包装我的浮点数组的每个元素,那我该怎么办?我试过寻找解决方案,但不幸的是,泛型类型使用“数组”这个词意味着我被错误的线索淹没了。谢谢

标签: javaarraysavro

解决方案


所以回答我自己的问题 - 一种方法是使用模式中的“字节”数据类型将浮点数组转换为字节数组(或更准确地说,字节缓冲区)。来自我的作家

    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 不允许 FloatBuffer 上的后续 .array


推荐阅读