Avro 文件始终读取为 GenericRecord

Avro Files always read as GenericRecord

我有一个具有指定架构的 avro 文件。 当我加载 Avro 文件时,它们总是以 GenericData 的形式出现,即使我指定了架构。

val schema = Article.Schema$
val job = new Job()
AvroJob.setInputKeySchema(job, schema)
val rootDir = "path-to-avro-files"
val articlesRDD = sc.newAPIHadoopFile(rootDir, classOf[AvroKeyInputFormat[Article]], classOf[AvroKey[Article]], classOf[NullWritable], job.getConfiguration)

此代码有效,我得到一个 RDD,其中包含 avro 文件中的数据,但不幸的是,RDD 的条目都是 GenericData 类型。这意味着每当我想访问特定模式的字段时,都会收到以下错误:

Caused by: java.lang.ClassCastException: org.apache.avro.generic.GenericData$Record cannot be cast to de.uni_mannheim.desq.converters.nyt.avroschema.Article

这是我用来从 avro 文件中提取字段的代码

val abstracts = articlesRDD.map(tuple => {
    val abstract = tuple._1.datum.getAbstract
    abstract
}

在访问 'datum' 之后调用 'asInstanceOf'(为了将 GenericRecord 转换为我的文章)也会导致同样的错误。

所以我最终遵循了本教程 (http://subprotocol.com/system/apache-spark-ec2-avro.html) 并使用更新版本的 Avro 工具重新生成了我的 AvroSchema。 使用 avro-tools 1.7.x 生成的版本不适用于此解决方案,而使用 1.8.1 生成的版本可以。