2016年09月10日

JavaでAvroのGenericRecordの中身をループで見る

やり方がわからなかったので調べた。getFieldsでSchema.Fieldの一覧を取ってそれをループさせれば良いようだ。

Recordが入れ子になっている場合は型調べつつ再帰的にやれば子要素まで取れると思う(未確認)。

Javaと言いつつコードはScala。まあ、同じようなものだし。

import org.apache.avro.generic.GenericRecord
import scala.collection.JavaConversions._

def getGenericRecord(): GenericRecord = {
  // get generic record code
}

val record = getGenericRecord()

for (field <- record.getSchema.getFields) {
  // 方法1
  println(field.name, record.get(field.name))
  // 方法2
  println(field.name, record.get(field.pos))
}
GenericRecordのgetにはStringとInt双方の引数が取れるようになっていて、Fieldのnameを渡してもposを渡しても同じように取れる。