当前位置: 首页 > 面试题库 >

在Java中创建镶木地板文件

陈富
2023-03-14
问题内容

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

我的内存中有数据(java类),我想将其写入一个Parquet文件中,以便以后从apache-drill中读取它。

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

得到它了

谢谢您的帮助。

结合答案和此链接,我能够创建一个实木复合地板文件并用钻头将其读回。


问题答案:

不建议使用ParquetWriter的构造函数(1.8.1),但不建议使用ParquetWriter本身,您仍然可以通过扩展其中的abstract
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,协议缓冲区或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>

完整的例子在这里。



 类似资料:
  • 有没有一种方法可以直接从基于avro模式的parquet文件在Amazon Athena中创建表?模式被编码到文件中,所以我需要自己实际创建DDL看起来很愚蠢。 我看到了这个,还有另一个复制品 但它们与Hive直接相关,这对雅典娜不起作用。理想情况下,我正在寻找一种以编程方式执行此操作的方法,而无需在控制台上定义它。

  • 我有一个数据帧,它是由运行特定日期的每日批处理创建的,然后保存在HDFS(Azure Data Lake Gen 2)中。 它是用这样的东西保存的 如您所见,我没有对数据帧进行分区,因为它只包含一个日期。 例如,第一天的第一个文件将存储在文件夹中 交易/2019/08/25 然后第二天,它就会在文件夹里 贸易/2019/08/26 问题是,当所有数据都放好后,日期上的过滤器谓词是否仍会被按下,HD

  • 我一直在阅读有关此主题的一些问题以及几个论坛,并且在所有这些论坛中,他们似乎都提到从Spark中产生的每个. parket文件应该是64MB或1GB大小,但仍然无法让我想到哪些案例场景属于每个这些文件大小以及除了HDFS将它们拆分为64MB块之外的原因。 我当前的测试场景如下。 我目前每天处理2.5GB到3GB的数据,这些数据每年将被拆分并保存到每日存储桶中。n等于4或48的原因只是为了测试,因为

  • 我无法使用镶木地板文件将列的类型从更改为。 使用: 改变表DATABASE.TABLE改变COL INT(从字符串到int) 或 < code >更改表数据库。表格更改列列字符串(从int到string) 读取数据时产生错误: 文件x的“db.table.col”列具有不兼容的拼花架构。列类型:INT,拼花模式:可选byte_array col[i:1 d:1 r:0] 读了这个留档,我明白: T

  • 我试图创建一个Hive表与模式字符串,字符串,双在包含两个拼花文件的文件夹上。第一个拼花文件模式是字符串,字符串,双,第二个文件的模式是字符串,双,字符串。 我正在尝试使用pig(0.14)脚本中的hive表。 但我得到了错误 java.lang.UnsupportedOperationException:无法检查org.apache.hadoop.hive.serde2.io.DoubleWri

  • 我有一个avro格式的数据流(json编码),需要存储为镶木地板文件。我只能这样做, 把df写成拼花地板。 这里的模式是从json中推断出来的。但是我已经有了avsc文件,我不希望spark从json中推断出模式。 以上述方式,parquet文件将模式信息存储为StructType,而不是avro.record.type。是否也有存储avro模式信息的方法。 火花 - 1.4.1