在 java 网络应用程序中将 avro 文件转换为 csv

Convert avro file into csv in java web application

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

您可以使用 avro-tools 读取 avro 记录,从文件中获取架构和记录 附上草稿:

我使用的是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);
    }
}