Avro文件始终读作GenericRecord

时间:2017-05-08 17:02:40

标签: scala apache-spark avro

我有一个带有指定架构的avro文件。 当我加载Avro文件时,即使我指定了Schema,它们也总是作为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)

此代码有效,我获得了包含在avro文件中的数据的RDD,但遗憾的是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
}

还要打电话给'asInstanceOf'在访问'数据' (为了将GenericRecord转换为我的文章)会导致同样的错误。

1 个答案:

答案 0 :(得分:1)

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