Java 读取 Parquet 文件

1. 引言

Parquet 是一种高效的列式存储格式,广泛应用于大数据处理和分析场景,如 Apache Spark、Hive 和 Hadoop 生态系统。Java 开发者可以使用 Apache Parquet 库来读取和写入 Parquet 文件。本篇博客将详细介绍如何使用 Java 读取 Parquet 文件,包括基础概念、依赖配置、代码示例和最佳实践。


2. 目录

  1. Parquet 文件简介
  2. Java 读取 Parquet 文件的依赖配置
  3. 使用 Apache Parquet 读取 Parquet 文件
  4. 使用 Apache Arrow 读取 Parquet 文件
  5. 最佳实践
  6. 总结
  7. 参考资料

3. Parquet 文件简介

Parquet 是 Apache 基金会开发的一种列式存储格式,具有以下特点:

  • 高效的列式存储,适用于数据分析和 OLAP(在线分析处理)场景。
  • 支持压缩,例如 Snappy、Gzip、LZO,减少存储占用。
  • 适用于分布式计算,如 Apache Spark、Flink 和 Hadoop。

4. Java 读取 Parquet 文件的依赖配置

在 Java 中,我们可以使用 Apache Parquet 提供的 API 读取 Parquet 文件。在 pom.xml 文件中添加以下依赖项:

<dependencies>
    <!-- Apache Parquet 依赖 -->
    <dependency>
        <groupId>org.apache.parquet</groupId>
        <artifactId>parquet-avro</artifactId>
        <version>1.12.3</version>
    </dependency>

    <dependency>
        <groupId>org.apache.parquet</groupId>
        <artifactId>parquet-hadoop</artifactId>
        <version>1.12.3</version>
    </dependency>

    <!-- Hadoop 依赖(如果使用 HDFS) -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>3.3.1</version>
    </dependency>

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-core</artifactId>
        <version>3.3.1</version>
    </dependency>
</dependencies>

5. 使用 Apache Parquet 读取 Parquet 文件

Apache Parquet 提供 ParquetReader 来读取 Parquet 文件,下面是一个简单的示例:

5.1 使用 ParquetReader 读取 Parquet 文件

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.parquet.hadoop.ParquetReader;
import org.apache.parquet.hadoop.ParquetFileReader;
import org.apache.parquet.hadoop.metadata.ParquetMetadata;
import org.apache.parquet.hadoop.util.HadoopInputFile;
import org.apache.parquet.schema.MessageType;
import org.apache.parquet.hadoop.example.GroupReadSupport;
import org.apache.parquet.example.data.Group;

public class ParquetFileReaderExample {
    public static void main(String[] args) {
        String filePath = "sample.parquet"; // 替换为你的 Parquet 文件路径
        Configuration configuration = new Configuration();
        
        try {
            Path path = new Path(filePath);
            ParquetReader<Group> reader = ParquetReader.builder(new GroupReadSupport(), path).withConf(configuration).build();

            Group group;
            while ((group = reader.read()) != null) {
                System.out.println(group.toString());
            }
            
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

5.2 解析 Parquet 文件的 Schema

如果想获取 Parquet 文件的 Schema,可以使用 ParquetFileReader

import org.apache.parquet.hadoop.metadata.ParquetMetadata;
import org.apache.parquet.schema.MessageType;
import org.apache.parquet.hadoop.ParquetFileReader;
import org.apache.parquet.hadoop.util.HadoopInputFile;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;

public class ParquetSchemaReader {
    public static void main(String[] args) {
        String filePath = "sample.parquet"; // 替换为你的 Parquet 文件路径
        Configuration configuration = new Configuration();
        
        try {
            Path path = new Path(filePath);
            ParquetMetadata metadata = ParquetFileReader.readFooter(configuration, path);
            MessageType schema = metadata.getFileMetaData().getSchema();
            
            System.out.println("Parquet Schema: " + schema.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

6. 使用 Apache Arrow 读取 Parquet 文件

Apache Arrow 也是一个高效的数据格式库,可以用来读取 Parquet 文件。

6.1 依赖项

<dependency>
    <groupId>org.apache.arrow</groupId>
    <artifactId>arrow-memory-core</artifactId>
    <version>11.0.0</version>
</dependency>

<dependency>
    <groupId>org.apache.arrow</groupId>
    <artifactId>arrow-vector</artifactId>
    <version>11.0.0</version>
</dependency>

<dependency>
    <groupId>org.apache.arrow</groupId>
    <artifactId>arrow-parquet</artifactId>
    <version>11.0.0</version>
</dependency>

6.2 使用 Apache Arrow 读取 Parquet

import org.apache.arrow.memory.BufferAllocator;
import org.apache.arrow.memory.RootAllocator;
import org.apache.arrow.vector.VectorSchemaRoot;
import org.apache.arrow.vector.ipc.ArrowReader;
import org.apache.arrow.dataset.file.FileFormat;
import org.apache.arrow.dataset.file.FileSystemDatasetFactory;
import org.apache.arrow.dataset.jni.NativeDatasetFactory;

import java.nio.file.Paths;

public class ArrowParquetReaderExample {
    public static void main(String[] args) {
        String filePath = "sample.parquet";
        try (BufferAllocator allocator = new RootAllocator()) {
            FileSystemDatasetFactory datasetFactory = new FileSystemDatasetFactory(allocator, FileFormat.PARQUET, filePath);
            ArrowReader reader = datasetFactory.finish().newScan().finish();
            
            while (reader.loadNextBatch()) {
                VectorSchemaRoot root = reader.getVectorSchemaRoot();
                System.out.println(root.contentToTSVString());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

7. 最佳实践

7.1 选择合适的 API

  • 如果需要 高效读取,推荐 Apache Parquet API (ParquetReader)。
  • 如果使用 大数据分析,推荐 Apache Arrow,可以和 Spark/Flink 结合使用。

7.2 使用 Snappy 压缩

  • Parquet 支持 Snappy、Gzip、LZO 压缩,推荐使用 Snappy,因为它解压缩速度快,占用空间小:
configuration.set("parquet.compression", "SNAPPY");

7.3 并行读取

  • 结合 Hadoop/HDFS 进行并行处理,提高读取速度:
configuration.set("fs.file.impl", "org.apache.hadoop.fs.LocalFileSystem");

8. 总结

本篇博客详细介绍了 Java 读取 Parquet 文件的几种方式:

  1. 使用 Apache Parquet API (ParquetReader) 读取 Parquet 文件。
  2. 解析 Parquet Schema 获取数据结构信息。
  3. 使用 Apache Arrow 读取 Parquet 文件,适用于大数据分析场景。
  4. 最佳实践,包括 API 选择、压缩方式和并行读取策略。

9. 参考资料

posted @   hyzz123  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
点击右上角即可分享
微信分享提示