在java中创建镶木地板文件

2022-09-02 21:05:19

有没有办法从java创建镶木地板文件?

我在内存(java类)中有数据,我想把它写到一个镶木地板文件中,以便以后从apache-drill读取它。

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

明白了

感谢您的帮助。

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


答案 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编写镶木地板的示例:

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>

此处为完整示例。


答案 2

几种可能的方法:

  • 使用 Java Parquet 库直接从您的代码编写 Parquet。
  • 使用 JDBC 连接到 Hive 或 Impala,并使用 SQL 插入数据。请注意,如果逐行插入,将导致每个单独的记录都有单独的文件,并会完全破坏性能。您应该一次插入大量行,这不是微不足道的,因此我不建议使用此方法。
  • 将数据存储到带分隔符的文本文件中,然后在 Hive 或 Impala 中执行以下步骤:
    • 在文本文件上定义一个表,以允许 Hive/Impala 读取数据。让我们将此表称为 .有关详细信息,请参阅 Impala 的创建表语句text_table
    • 创建一个具有相同列的新表,但指定 Parquet 作为其文件格式。让我们将此表称为 .parquet_table
    • 最后执行 一个将文本文件中的所有数据复制到镶木地板表中。insert into parquet_table select * from text_table

推荐