2017-05-08 4 views
1

私は指定されたスキーマを持つavroファイルを持っています。 Avroファイルを読み込んでいるときに、スキーマを指定していても、常にGenericDataとして出力されます。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) 

このコードは動作し、私はアブロファイルに含まれるデータと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 

これは私が

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

またアブロファイルからフィールドを抽出するために使用するコードは次のとおりです。これは私が私の特定のスキーマのフィールドにアクセスしたいとき、私は次のエラーを取得しています意味します'datum'にアクセスした後に 'asInstanceOf'を呼び出すと(GenericRecordをMy Articleに変換するために)、同じエラーが発生します。

+0

'SpecifcRecord'が必要な場合は、プロパティとスキーマが一致する' ISpecificRecord'を実装するクラスが必要です。 – JSteward

+0

私は、avroツールjarを持つavroスキーマからSpecificRecordを実装するクラスを自動生成しました。 – 2rist

答えて

1

私はこのチュートリアル(http://subprotocol.com/system/apache-spark-ec2-avro.html)に続き、私のAvroSchemaを新しいバージョンのAvro-toolsで再生成しました。 1.8.1で生成されたバージョンでは、avro-tools 1.7.xで生成されたバージョンはこのソリューションでは動作しません。

関連する問題