在 java 中创建镶木地板文件
create parquet files in java
有没有办法从 java 创建 parquet 文件?
我在内存中有数据 (java 类),我想将它写入一个 parquet 文件,稍后从 apache-drill 读取它。
有没有一种简单的方法可以做到这一点,比如将数据插入 sql table?
知道了
感谢您的帮助。
结合答案和这个 link,我能够创建一个 parquet 文件并用 drill 读回它。
几种可行的方法:
- 使用 Java Parquet 库直接从您的代码编写 Parquet。
- 使用 JDBC 连接到 Hive 或 Impala 并使用 SQL 插入数据。请注意,如果您逐行插入,每条记录都会生成单独的文件,并且会完全破坏性能。您应该一次插入 lots 行,这很重要,所以我不推荐这种方法。
- 将数据保存到带分隔符的文本文件,然后在 Hive 或 Impala 中执行以下步骤:
- 在文本文件上定义一个 table 以允许 Hive/Impala 读取数据。我们称之为 table
text_table
。有关详细信息,请参阅 Impala 的 Create Table Statement。
- 使用相同的列创建一个新的 table,但指定 Parquet 作为其文件格式。我们称之为 table
parquet_table
.
- 最后执行
insert into parquet_table select * from text_table
将所有数据从文本文件复制到 parquet table。
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.
有没有办法从 java 创建 parquet 文件?
我在内存中有数据 (java 类),我想将它写入一个 parquet 文件,稍后从 apache-drill 读取它。
有没有一种简单的方法可以做到这一点,比如将数据插入 sql table?
知道了
感谢您的帮助。
结合答案和这个 link,我能够创建一个 parquet 文件并用 drill 读回它。
几种可行的方法:
- 使用 Java Parquet 库直接从您的代码编写 Parquet。
- 使用 JDBC 连接到 Hive 或 Impala 并使用 SQL 插入数据。请注意,如果您逐行插入,每条记录都会生成单独的文件,并且会完全破坏性能。您应该一次插入 lots 行,这很重要,所以我不推荐这种方法。
- 将数据保存到带分隔符的文本文件,然后在 Hive 或 Impala 中执行以下步骤:
- 在文本文件上定义一个 table 以允许 Hive/Impala 读取数据。我们称之为 table
text_table
。有关详细信息,请参阅 Impala 的 Create Table Statement。 - 使用相同的列创建一个新的 table,但指定 Parquet 作为其文件格式。我们称之为 table
parquet_table
. - 最后执行
insert into parquet_table select * from text_table
将所有数据从文本文件复制到 parquet table。
- 在文本文件上定义一个 table 以允许 Hive/Impala 读取数据。我们称之为 table
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.