如何将数据集<Row>转换为列表<GenericRecord>

问题描述 投票:0回答:1

想知道如何将

Dataset<Row>
转换为
List<GenericRecord>

我正在谈论:

org.apache.avro.generic.GenericRecord

org.apache.spark.sql.Dataset

org.apache.spark.sql.Row

Dataset<Row> data = spark.sql(SQL_QUERY)

每个

SQL_QUERY
的结果都不同,因此每个用例的模式可能不同。

重要的是要知道我正在从

Iceberg
表中读取内容,并将文件保存为
.avro

我目前的想法是找到一种方法将

Row
中的每个
Dataset<Row>
转换为
bytes[]
,然后转换为:

public static List<GenericRecord> deserialize(byte[] bytes) {
    List<GenericRecord> records = new ArrayList<>();
    try {
        DataFileReader<GenericRecord> reader = new DataFileReader<>(
                new SeekableByteArrayInput(bytes),
                new ExpectedSpecificDatumReader()
        );

        while (reader.hasNext()) {
            records.add(reader.next(null));
        }
        reader.close();
    } catch (Exception e) {
        throw new Error(e);
    }
    return records;
}
java apache-spark apache-spark-sql avro apache-iceberg
1个回答
-1
投票

iceberg 有一个实用程序类可以帮助你:

org.apache.iceberg.spark.SparkValueConverter

© www.soinside.com 2019 - 2024. All rights reserved.