gpt4 book ai didi

file - 写入 Avro 数据文件

转载 作者:行者123 更新时间:2023-12-04 03:12:37 25 4
gpt4 key购买 nike

以下代码只是将数据写入 avro 格式,并从写入的 avro 文件中读取和显示相同的数据。我只是在尝试 Hadoop 权威指南中的示例。我能够第一次执行这个。然后我收到以下错误。它第一次起作用了。所以我不确定我犯了什么错误。

这是异常(exception):

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

最佳答案

您可能没有正确读取架构文件。我怀疑这是问题所在,因为堆栈跟踪显示它无法解析架构:

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 变量中,然后 parse它直接而不是使用资源加载器:
String schemaJson = "paste schema here (and fix quotes)";
Schema schema = Schema.parse(schemaJson);
GenericRecord datum = new GenericData.Record(schema);
...

关于file - 写入 Avro 数据文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5545496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com