Skip to content

读写

xml

<dependency>
    <groupId>org.apache.avro</groupId>
    <artifactId>avro</artifactId>
    <version>1.12.0</version>
</dependency>
xml

<dependency>
    <groupId>org.duckdb</groupId>
    <artifactId>duckdb_jdbc</artifactId>
    <version>1.2.1</version>
</dependency>
java

@Data
public class Employee {
    private String name;
    private int employeeId;
    private String department;

    // 必须有无参构造函数
    public Employee() {
    }

    // getters和setters
    // 省略...
}
java
package a;

import org.apache.avro.Schema;
import org.apache.avro.file.CodecFactory;
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.DatumWriter;
import org.apache.avro.io.Encoder;
import org.apache.avro.io.EncoderFactory;
import org.apache.avro.io.JsonEncoder;
import org.apache.avro.reflect.ReflectData;
import org.apache.avro.reflect.ReflectDatumWriter;
import org.duckdb.DuckDBConnection;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.OutputStream;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.*;

public class ReflectAvroWriter2 {
    public static void main(String[] args) throws Exception {
        // Define the ReflectDatumWriter with the Employee class
        DatumWriter<Employee> writer = new ReflectDatumWriter<>(Employee.class);

        // Get the Avro schema for the Employee class
        Schema schema = ReflectData.get().getSchema(Employee.class);

        // Create an Employee instance and set its properties


        // Create a file to write the Avro data
        File file = new File("employee.avro");

        // Create a DataFileWriter to write the Employee data to the file
        try (DataFileWriter<Employee> dataFileWriter = new DataFileWriter<>(writer)) {
            // Check if the file already exists
            if (file.exists()) {
                // Append to the existing file
                dataFileWriter.appendTo(file);
            } else {
                // Create a new file with the schema
                dataFileWriter.create(schema, file);
            }
            for (int i = 0; i < 100000; i++) {
                Employee emp1 = new Employee();
                emp1.setName("王五");
                emp1.setEmployeeId(i);
                emp1.setDepartment("研发部");
                dataFileWriter.append(emp1);
            }
        }
        System.out.println("Employee data successfully written to employee.avro");

        Properties props = new Properties();
        props.setProperty("memory_limit", "200MB");
        DuckDBConnection duckConnection = (DuckDBConnection) DriverManager.getConnection("jdbc:duckdb:", props);
        try (Statement statement = duckConnection.createStatement()) {
            statement.execute("INSTALL avro FROM community");
        }
        try (Statement statement = duckConnection.createStatement()) {
            statement.execute("LOAD avro");
        }
        try (Statement statement = duckConnection.createStatement();
             ResultSet resultSet = statement.executeQuery("select * from  " +
                     " read_avro('C:\\dev\\code\\duckdb_mem\\employee.avro'); ")) {
            ResultSetMetaData metaData = resultSet.getMetaData();
            int columns = metaData.getColumnCount();
            List<Map<String, Object>> result = new ArrayList<>();
            while (resultSet.next()) {
                Map<String, Object> rowMap = new HashMap<>(columns);
                for (int j = 1; j <= columns; ++j) {
                    rowMap.put(metaData.getColumnName(j), resultSet.getObject(j));
                }
                result.add(rowMap);
            }
            System.out.println(result);
        }
    }
}