2011-04-04 57 views
1

下面的代碼簡單地將數據寫入到的Avro格式和讀取並顯示從書面太Avro的文件相同。我只是嘗試了Hadoop權威指南書中的示例。我第一次能夠執行這個任務。然後我得到以下錯誤。它第一次工作。所以我不確定我犯的錯誤。寫Avro的數據文件

這是例外:

Exception in thread "main" java.io.EOFException: No content to map to Object due to end of input 
    at org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2173) 
    at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2106) 
    at org.codehaus.jackson.map.ObjectMapper.readTree(ObjectMapper.java:1065) 
    at org.codehaus.jackson.map.ObjectMapper.readTree(ObjectMapper.java:1040) 
    at org.apache.avro.Schema.parse(Schema.java:895) 
    at org.avro.example.SimpleAvro.AvroExample.avrocreate(AvroDataExample.java:23) 
    at org.avro.example.SimpleAvro.AvroDataExample.main(AvroDataExample.java:55) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.hadoop.util.RunJar.main(RunJar.java:156) 

這是代碼:

package org.avro.example.SimpleAvro; 

import java.io.File; 
import java.io.IOException; 

import org.apache.avro.Schema; 
import org.apache.avro.file.DataFileReader; 
import org.apache.avro.file.DataFileWriter; 
import org.apache.avro.generic.GenericData; 
import org.apache.avro. generic.GenericDatumReader; 
import org.apache.avro.generic.GenericDatumWriter; 
import org.apache.avro.generic.GenericRecord; 
import org.apache.avro.io.DatumReader; 
import org.apache.avro.io.DatumWriter; 

class AvroExample{ 

    AvroExample(){ 

    } 
    void avrocreate() throws Exception{ 

     Schema schema=Schema.parse(getClass().getResourceAsStream("Pair.avsc")); 

     GenericRecord datum=new GenericData.Record(schema); 
     datum.put("left", "L"); 
     datum.put("right", "R"); 

     File file=new File("data.avro"); 
     DatumWriter<GenericRecord> writer=new GenericDatumWriter<GenericRecord>(schema); 
     DataFileWriter<GenericRecord> dataFileWriter=new DataFileWriter<GenericRecord>(writer); 
     dataFileWriter.create(schema, file); 
     dataFileWriter.append(datum); 
     dataFileWriter.close(); 

     System.out.println("Written to avro data file"); 
     //reading from the avro data file 

     DatumReader<GenericRecord> reader= new GenericDatumReader<GenericRecord>(); 
     DataFileReader<GenericRecord> dataFileReader=new DataFileReader<GenericRecord>(file,reader); 
     GenericRecord result=dataFileReader.next(); 
     System.out.println("data" + result.get("left").toString()); 

     result=dataFileReader.next(); 
     System.out.println("data :" + result.get("left").toString()); 


    } 

} 
public class AvroDataExample { 
    public static void main(String args[])throws Exception{ 

     AvroExample a=new AvroExample(); 
     a.avrocreate(); 
    } 



} 

以下是文件[書中的示例代碼給出]的Pair.avsc

{ 
    "type": "record", 
    "name": "Pair", 
    "doc": "A pair of strings.", 
    "fields": [ 
    {"name": "left", "type": "string"}, 
    {"name": "right", "type": "string"} 
    ] 
} 
+0

當我試圖嵌入模式作爲一個字符串,我能夠成功地運行該程序。 – Sri 2011-04-05 00:06:05

回答

3

您可能沒有正確讀取模式文件。我懷疑這是問題,因爲堆棧跟蹤表明,它未能解析模式:

Exception in thread "main" java.io.EOFException: No content to map to Object due to end of input 
    at org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2173) 
    at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2106) 
    at org.codehaus.jackson.map.ObjectMapper.readTree(ObjectMapper.java:1065) 
    at org.codehaus.jackson.map.ObjectMapper.readTree(ObjectMapper.java:1040) 
    at org.apache.avro.Schema.parse(Schema.java:895) 

讀取文件從「資源」是百病叢生,除非你有你的環境設置得恰到好處。另外,既然你提到它曾經工作過一次,你可能只是改變了第二次運行的一些環境設置(如工作目錄)。

嘗試的複製粘貼的模式串入一個字符串變量和parse它直接而不是使用資源加載器:

String schemaJson = "paste schema here (and fix quotes)"; 
Schema schema = Schema.parse(schemaJson); 
GenericRecord datum = new GenericData.Record(schema); 
... 
+0

我遇到了同樣的問題,我在將代碼中的架構進行了修復。但是我不知道它無法找到avsc文件的環境設置有什麼問題。請問你能幫幫我嗎? – sina 2014-06-03 10:00:32

1
GenericRecord result=dataFileReader.next(); 
    System.out.println("data" + result.get("left").toString()); 
    result=dataFileReader.next(); 
    System.out.println("data :" + result.get("left").toString()); 

我想這是你要去哪裏錯了。

你應該叫「左」屬性以及您記錄的「正確」的屬性。

試試吧。

它爲我工作。

0

如果該文件是在你的罐子的地方的根目錄下的文件名前斜線。

Schema.parse(getClass().getResourceAsStream("/Pair.avsc"));