Как прочитать схему Avro из пустого RDD?

Я использую AvroKeyInputFormat для чтения файлов avro:

val records = sc.newAPIHadoopFile[AvroKey[T], NullWritable, AvroKeyInputFormat[T]](path)
  .map(_._1.datum())

Поскольку мне нужно размышлять над схемой в своей работе, я получаю схему Avro следующим образом:

val schema = records.first.getSchema

К сожалению, это не удается, если файлы avro в path пусты (они включают схему записи, но не содержат записей).

Есть ли простой способ загрузить схему avro только с помощью Spark, даже если записей нет?


person Luegg    schedule 04.12.2017    source источник


Ответы (1)


Я нашел решение (вдохновленное com.databricks.spark.avro.DefaultSource):

/**
  * Loads a schema from avro files in `directory`. This method also works if none
  * of the avro files contain any records.
  */
def schema(directory: String)(implicit sc: SparkContext): Schema = {
  val fs = FileSystem.get(new URI(directory), sc.hadoopConfiguration)
  val it = fs.listFiles(new Path(directory), false)

  var avroFile: Option[FileStatus] = None

  while (it.hasNext && avroFile.isEmpty) {
    val fileStatus = it.next()

    if (fileStatus.isFile && fileStatus.getPath.getName.endsWith(".avro")) {
      avroFile = Some(fileStatus)
    }
  }

  avroFile.fold {
    throw new Exception(s"No avro files found in $directory")
  } { file =>
    val in = new FsInput(file.getPath, sc.hadoopConfiguration)
    try {
      val reader = DataFileReader.openReader(in, new GenericDatumReader[GenericRecord]())
      try {
        reader.getSchema
      } finally {
        reader.close()
      }
    } finally {
      in.close()
    }
  }
}
person Luegg    schedule 04.12.2017
comment
Я бродил, если вам может понадобиться получить схему заранее. records.first подозрительно. - person mariotti; 05.12.2017