2017-05-08 126 views
1

我有一個指定模式的avro文件。 當我加載Avro文件時,他們總是以GenericData出現,即使我指定了Schema。Avro文件總是讀爲GenericRecord

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 
} 

而且提取的字段代碼在訪問'datum'(爲了將GenericRecord轉換爲我的文章)後調用'asInstanceOf'導致相同的錯誤。

+0

如果你想要'specifcRecord',你需要一個類來實現具有匹配屬性和模式的'ISpecificRecord'。 – JSteward

+0

我有自動生成的類實現SpecificRecord avro工具jar與avro工具。 – 2rist

回答