首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法从java中的AVRO文件生成CSV

无法从java中的AVRO文件生成CSV
EN

Stack Overflow用户
提问于 2021-08-27 07:22:08
回答 1查看 193关注 0票数 0

无法生成AVRO到CSV,无法找出错误的根源

pom.xml-

代码语言:javascript
运行
复制
<jackson.version>2.12.4</jackson.version>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hppc</artifactId>
    <version>${jackson.version}</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-json-org</artifactId>
    <version>${jackson.version}</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-csv</artifactId>
    <version>${jackson.version}</version>
    <type>jar</type>
</dependency>

模型-

代码语言:javascript
运行
复制
package com.test.employee.model;
import java.time.ZonedDateTime;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonPropertyOrder({"id", "name", "modifiedTimestamp", "score"})

public class EmployeeModel {
    @JsonProperty("id")
    private String id;
    
    @JsonProperty("name")
    private String name;
    
    @JsonProperty("modifiedTimestamp")
    private ZonedDateTime modifiedTimestamp;
    
    @JsonProperty("score")
    private String score;
    
    @JsonIgnore
    private String employeeId;
 
    public EmployeeModel(String id, String name, ZonedDateTime modifiedTimestamp,
    @JsonProperty("score"), String score) {
        this.id = id;
        this.name = name;
        this.modifiedTimestamp = modifiedTimestamp;
        this.score = score;
    } 

    public String getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    public ZonedDateTime getModifiedTimestamp() {
        return modifiedTimestamp;
    }
    public String getScore() {
        return score;
    }
    
    public String getEmployeeId() {
        return employeeId;
    }
}

代码语言:javascript
运行
复制
public class Test {
        private File avroToCsv(File avroFile, String path) {
                File result = new File(path);

                if (result.exists()) result.delete();

                try {
                    GenericDatumReader<GenericData.Record> datum = new GenericDatumReader<>();
                    DataFileReader<GenericData.Record> reader = new DataFileReader<>(avroFile, datum);
                    GenericData.Record record = new GenericData.Record(reader.getSchema()); 
                    CsvMapper csvMapper = new CsvMapper();
                    CsvSchema schema = csvMapper.schemaFor(EmployeeModel.class).withHeader();
                    OutputStream outStream = new FileOutputStream(result , true);
                    CsvGenerator csvGenerator = csvMapper.getFactory().createGenerator(outStream);
                    ObjectWriter csvWriter = csvMapper.writer(schema);

                    while (reader.hasNext()) {
                        reader.next(record);
                        LocalDateTime dateTime = LocalDateTime.parse(modifDate);
                        ZonedDateTime modifiedDate = ZonedDateTime.of(dateTime, ZoneId.systemDefault());
                        EmployeeModel tempModel = new EmployeeModel(
                                record.get("id").toString(),
                                record.get("name").toString(),
                                modifiedDate,
                                record.get("score").toString()
                        );
                    csvWriter.writeValue(csvGenerator, tempModel);
                    }
                }catch (Exception e) {
                    e.printStackTrace();
                }
        }
    
        public static void main(String []args) {
            avroToCsv(new File("abc.avro"), "c:/test/ModifiedUsers.csv");
        }   
}

模式对象包含标题如下:"id“、"name”、"modifiedTimestamp“、"score”Employee模型包含的值为:"123456“、"demoapp”、2021-04-16T19:00:54、"2.4“。

收到的例外情况: //

代码语言:javascript
运行
复制
com.fasterxml.jackson.databind.JsonMappingException: [no message for java.lang.NullPointerException]
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._wrapAsIOE(DefaultSerializerProvider.java:509)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:482)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
    at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1396)
    at com.fasterxml.jackson.databind.ObjectWriter._configAndWriteValue(ObjectWriter.java:1120)
    at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:933)
    at com.test.employee.Test.avroToCsv(AvroToCsv.java:164)
    at com.test.employee.Test.main(Test.java:41)

代码语言:javascript
运行
复制
Caused by: java.lang.NullPointerException
    at com.fasterxml.jackson.core.base.GeneratorBase.setCurrentValue(GeneratorBase.java:138)
    at com.fasterxml.jackson.core.base.GeneratorBase.writeStartObject(GeneratorBase.java:290)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:151)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
    ... 7 more

// com.fasterxml.jackson.core.JsonGenerationException:无法启动对象,期待字段名在com.fasterxml.jackson.core.JsonGenerator._reportError(JsonGenerator.java:1961),com.fasterxml.jackson.dataformat.csv.CsvGenerator._verifyValueWrite(CsvGenerator.java:957),com.fasterxml.jackson.dataformat.csv.CsvGenerator.writeStartObject(CsvGenerator.java:584),com.fasterxml.jackson.core.base.GeneratorBase.writeStartObject(GeneratorBase.java:286),com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:151),com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480) at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319) at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1396) at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:913)

代码语言:javascript
运行
复制
Issue Identified with library:

https://github.com/FasterXML/jackson-dataformats-text/issues/114
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-30 22:24:55

这里的问题不是模式,也不是缺乏模式(某种程度),而是您正在为每个值构建新的ObjectWriter实例:这是行不通的。

相反,如果要单独编写行序列,则需要构造一个SequenceWriter。类似于:

代码语言:javascript
运行
复制
ObjectWriter ow = mapper.writerFor(schema);
SequenceWriter sw = ow.writeValues(outStream);

然后使用

代码语言:javascript
运行
复制
sw.write(tempModel);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68949432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档