Java 读取 Parquet 文件
1. 引言
Parquet 是一种高效的列式存储格式,广泛应用于大数据处理和分析场景,如 Apache Spark、Hive 和 Hadoop 生态系统。Java 开发者可以使用 Apache Parquet 库来读取和写入 Parquet 文件。本篇博客将详细介绍如何使用 Java 读取 Parquet 文件,包括基础概念、依赖配置、代码示例和最佳实践。
2. 目录
- Parquet 文件简介
- Java 读取 Parquet 文件的依赖配置
- 使用 Apache Parquet 读取 Parquet 文件
- 使用 Apache Arrow 读取 Parquet 文件
- 最佳实践
- 总结
- 参考资料
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 文件的几种方式:
- 使用 Apache Parquet API (
ParquetReader
) 读取 Parquet 文件。 - 解析 Parquet Schema 获取数据结构信息。
- 使用 Apache Arrow 读取 Parquet 文件,适用于大数据分析场景。
- 最佳实践,包括 API 选择、压缩方式和并行读取策略。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)