2015-09-28 92 views
2

我正在嘗試使用scala讀取avro文件。從scala讀取Avro文件

我一直在使用的Avro工具提取文件的模式,並將其保存到一個文件,然後我嘗試使用下面的代碼來閱讀:

val zibi= scala.io.Source.fromFile("/home/wasabi/schema").mkString 
val schema_obj = new Schema.Parser 
val schema2 = schema_obj.parse(zibi) 
val READER2 = new GenericDatumReader[GenericRecord](schema2) 
val myFile = Files.readAllBytes(Paths.get("/tmp/check/CMRF_80_1442744555901-1_1_2_1_1_1_4_10_1.avro")) 

val datum = READER2.read(null, DecoderFactory.defaultFactory.createBinaryDecoder(myFile,null)) 

,但我一直打的IOExceptions這樣:

java.io.IOException: Invalid int encoding 
     at org.apache.avro.io.BinaryDecoder.readInt(BinaryDecoder.java:145) 
     at org.apache.avro.io.ValidatingDecoder.readInt(ValidatingDecoder.java:83) 
     at org.apache.avro.generic.GenericDatumReader.readInt(GenericDatumReader.java:444) 
     at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:159) 
     at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:193) 
     at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:183) 
     at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:151) 
     at org.apache.avro.generic.GenericDatumReader.readArray(GenericDatumReader.java:219) 
     at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153) 
     at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:193) 
     at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:183) 
     at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:151) 
     at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:142) 

當我通過avro-tools閱讀文件時,它讀取得很好。

我在做什麼錯?

+0

你檢查以下內容:(似乎很相似,你的問題,並建議解決方案可能會爲你工作)https://issues.apache.org/jira/browse/AVRO-1650 –

+0

嗨, 是的,我看見它了。我沒有轉換或從字符串轉換,所以我不認爲它是相關的(除非readAllBytes有某種編碼配置)。只是爲了確保我試着用建議的編碼將它看作字符串,但也失敗了。 謝謝 –

回答

3

嘗試使用DataFileReader而不是使用BinaryDecoder

儘管編碼器/解碼器用於寫入和讀取原始avros,但我懷疑它們在avro數據文件中找到的頭信息上窒息。

import org.apache.avro.generic.{ GenericDatumReader, GenericRecord } 
import org.apache.avro.file.DataFileReader 

val zibi= scala.io.Source.fromFile("/home/wasabi/schema").mkString 
val schema_obj = new Schema.Parser 
val schema2 = schema_obj.parse(zibi) 
val READER2 = new GenericDatumReader[GenericRecord](schema2) 

val myFile = new File("/tmp/check/CMRF_80_1442744555901-1_1_2_1_1_1_4_10_1.avro") 
val dataFileReader = new DataFileReader[GenericRecord](myFile, READER2) 
val datum = dataFileReader.next() 
+0

它的工作原理。非常感謝! –