【问题标题】:create parquet files in java在java中创建镶木地板文件
【发布时间】:2026-02-14 07:00:01
【问题描述】:

有没有办法从 java 创建 parquet 文件?

我在内存中有数据(java 类),我想将其写入 parquet 文件,以便稍后从 apache-drill 中读取。

有没有一种简单的方法可以做到这一点,比如将数据插入到 sql 表中?

明白了

感谢您的帮助。

结合答案和这个link,我能够创建一个镶木地板文件并用钻头读回。

【问题讨论】:

  • 在您提供的示例中,您定义了架构。不知道架构也可以写吗?
  • 我不知道,抱歉。我正在使用预定义的架构

标签: java parquet


【解决方案1】:

ParquetWriter 的构造函数已弃用(1.8.1),但 ParquetWriter 本身已弃用,您仍然可以通过在其中扩展抽象 Builder 子类来创建 ParquetWriter。

这里是镶木地板创造者自己的一个例子ExampleParquetWriter

  public static class Builder extends ParquetWriter.Builder<Group, Builder> {
    private MessageType type = null;
    private Map<String, String> extraMetaData = new HashMap<String, String>();

    private Builder(Path file) {
      super(file);
    }

    public Builder withType(MessageType type) {
      this.type = type;
      return this;
    }

    public Builder withExtraMetaData(Map<String, String> extraMetaData) {
      this.extraMetaData = extraMetaData;
      return this;
    }

    @Override
    protected Builder self() {
      return this;
    }

    @Override
    protected WriteSupport<Group> getWriteSupport(Configuration conf) {
      return new GroupWriteSupport(type, extraMetaData);
    }

  }

如果您不想使用 Group 和 GroupWriteSupport(捆绑在 Parquet 中,但仅用作数据模型实现的示例),您可以使用 Avro、Protocol Buffers 或 Thrift 内存数据模型。下面是一个使用 Avro 编写 Parquet 的示例:

try (ParquetWriter<GenericData.Record> writer = AvroParquetWriter
        .<GenericData.Record>builder(fileToWrite)
        .withSchema(schema)
        .withConf(new Configuration())
        .withCompressionCodec(CompressionCodecName.SNAPPY)
        .build()) {
    for (GenericData.Record record : recordsToWrite) {
        writer.write(record);
    }
}   

您将需要这些依赖项:

<dependency>
    <groupId>org.apache.parquet</groupId>
    <artifactId>parquet-avro</artifactId>
    <version>1.8.1</version>
</dependency>

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

完整示例here

【讨论】:

  • 不知道架构也可以写吗?
  • @7H3IN5ID3R 没有。您必须指定架构
  • 是的,明白了。我的情况不同,正在流动的事件有不同的不同模式。我可以使用 pandas 和快速镶木地板与 python 进行转换。将查找模式的责任移交给 Pandas。
  • Path 类还需要 Hadoop 核心部门
  • @7H3IN5ID3R 你能弄清楚如何将它用于不同的架构吗?
【解决方案2】:

几种可能的方法:

  • 使用 Java Parquet 库直接从您的代码中编写 Parquet。
  • 使用 JDBC 连接到 Hive 或 Impala,并使用 SQL 插入数据。请注意,如果您一一插入行,则会为每个单独的记录生成单独的文件,并且会完全破坏性能。您应该一次插入 很多 行,这并不简单,所以我不推荐这种方法。
  • 将数据保存到分隔文本文件,然后在 Hive 或 Impala 中执行以下步骤:
    • 在文本文件上定义一个表以允许 Hive/Impala 读取数据。让我们将此表称为text_table。有关详细信息,请参阅 Impala 的 Create Table Statement
    • 创建具有相同列但指定 Parquet 作为其文件格式的新表。让我们将此表称为parquet_table
    • 最后通过insert into parquet_table select * from text_table 将文本文件中的所有数据复制到 parquet 表中。

【讨论】:

  • 我想选择第一个选项并使用 ParquetWriter,但它被标记为@depriated。所以我去了 ParquetFileWriter,但我找不到任何关于如何定义和使用它的示例。浏览 csv 会非常慢,因为它实际上是我想通过我的应用程序流式传输的大量数据。所以我必须把它全部写到csv然后转换它。有第一个选项的例子吗?