首页 > 解决方案 > 在 Java Web 应用程序中将 avro 文件转换为 csv

问题描述

我们有一个要求,我们想转换一个 avro 文件,我们从我们的 Java Web 应用程序中的第三方供应商 API 下载该文件。我尝试浏览一些资源,在这些资源中我只能找到在 avro-tools.jar 的帮助下执行的命令,但我正在寻找一种在 Java Web 应用程序中实现这一目标的方法。非常感谢任何帮助。

标签: javacsvavro

解决方案


您可以使用avro-tools来读取 avro 记录,从文件 Attaching a rough draft 中获取 Schema 和记录:

JSON用作中介,您可以将其修改为您选择的任何格式

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.CDL;
import org.json.JSONArray;
import org.json.JSONException;
import org.apache.avro.Schema;
import org.apache.avro.Schema.Field;
import org.apache.avro.file.DataFileReader;
import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.GenericDatumReader;
import org.apache.commons.io.FileUtils;

public class AvroToCSV {

    public static void readAvro(File file) {
    // Read Avro ,parse Schema to get field names and parse it to json
        try {

            GenericDatumReader<GenericData.Record> datum = new GenericDatumReader<GenericData.Record>();
            DataFileReader<GenericData.Record> reader = new DataFileReader<GenericData.Record>(file, datum);

            GenericData.Record record = new GenericData.Record(reader.getSchema());
            Schema schema = reader.getSchema();
            List<String> fieldValues = new ArrayList<>();
            JSONArray jsonArray = new JSONArray();
            for (Field field : schema.getFields()) {
                fieldValues.add(field.name());
            }

            while (reader.hasNext()) {
                reader.next(record);
                Map<String, String> jsonFileds = new HashMap<String, String>();
                for (String item : fieldValues) {
                    System.out.println(item);

                    jsonFileds.put(item, record.get(item).toString());
                }
                jsonArray.put(jsonFileds);
            }
            System.out.println(jsonArray.toString());
            reader.close();
            jsonToCSV(jsonArray);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public static void jsonToCSV(JSONArray json) {
        File file = new File("avroToJson.csv");
        String csv;
        try {
            csv = CDL.toString(json);
            FileUtils.writeStringToFile(file, csv);
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        File f = new File("test.avro");
        readAvro(f);
    }
}

推荐阅读