Запись в файл данных Avro - PullRequest
       21

Запись в файл данных Avro

1 голос
/ 05 апреля 2011

Следующий код просто записывает данные в формат avro, читает и отображает их из записанного файла avro. Я только что попробовал пример из окончательного путеводителя Hadoop. Я смог выполнить это в первый раз. Тогда я получил следующую ошибку. Это сработало в первый раз. Поэтому я не уверен, какую ошибку я совершаю.

Это исключение:

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"}
  ]
}

Ответы [ 4 ]

3 голосов
/ 05 сентября 2011

Возможно, вы не правильно читаете файл схемы.Я подозреваю, что это проблема, потому что трассировка стека показывает, что она не может проанализировать схему:

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)

Чтение файлов из «ресурсов» чревато проблемами, если ваша среда не настроена правильно.Кроме того, поскольку вы упомянули, что это работало однажды, возможно, вы просто изменили некоторые параметры среды (например, рабочий каталог) для второго запуска.

Попробуйте скопировать строку схемы в переменную String и * 1006.* parse это напрямую, а не с помощью загрузчика ресурсов:

String schemaJson = "paste schema here (and fix quotes)";
Schema schema = Schema.parse(schemaJson);
GenericRecord datum = new GenericData.Record(schema);
...
1 голос
/ 22 мая 2012
    GenericRecord result=dataFileReader.next();
    System.out.println("data" + result.get("left").toString());
    result=dataFileReader.next();
    System.out.println("data :" + result.get("left").toString());

Полагаю, здесь вы ошибаетесь.

Вы должны вызвать атрибут "left" и атрибут "right" вашей записи.

Попробуйте.

Это сработало для меня.

0 голосов
/ 16 ноября 2014

Если файл находится в корне вашей банки, поставьте косую черту перед именем файла.

Schema.parse(getClass().getResourceAsStream("/Pair.avsc"));
0 голосов
/ 13 февраля 2014

Просто попробуйте использовать пример на javatute.com прямо здесь:

http://www.javatute.com/javatute/faces/post/hadoop/2014/reading-and-writing-complex-schema-using-avro-to-hdfs.xhtml

...