【问题标题】:Is it possible to read and write Parquet using Java without a dependency on Hadoop and HDFS?是否可以在不依赖 Hadoop 和 HDFS 的情况下使用 Java 读写 Parquet?
【发布时间】:2023-03-25 12:35:01
【问题描述】:

我一直在寻找这个问题的解决方案。

在我看来,如果不引入对 HDFS 和 Hadoop 的依赖,就无法在 Java 程序中嵌入读写 Parquet 格式。它是否正确?

我想在 Hadoop 集群之外的客户端计算机上读写。

我开始对 Apache Drill 感到兴奋,但它似乎必须作为一个单独的进程运行。我需要的是使用 Parquet 格式读写文件的进程内能力。

【问题讨论】:

    标签: java hadoop parquet apache-drill data-formats


    【解决方案1】:

    您可以使用 java Parquet Client API 在 hadoop 集群外编写 parquet 格式。

    这里是一个 java 中的示例代码,它将 parquet 格式写入本地磁盘。

    import org.apache.avro.Schema;
    import org.apache.avro.generic.GenericData;
    import org.apache.avro.generic.GenericRecord;
    import org.apache.hadoop.fs.Path;
    import org.apache.parquet.avro.AvroSchemaConverter;
    import org.apache.parquet.avro.AvroWriteSupport;
    import org.apache.parquet.hadoop.ParquetWriter;
    import org.apache.parquet.hadoop.metadata.CompressionCodecName;
    import org.apache.parquet.schema.MessageType;
    
    public class Test {
        void test() throws IOException {
            final String schemaLocation = "/tmp/avro_format.json";
            final Schema avroSchema = new Schema.Parser().parse(new File(schemaLocation));
            final MessageType parquetSchema = new AvroSchemaConverter().convert(avroSchema);
            final WriteSupport<Pojo> writeSupport = new AvroWriteSupport(parquetSchema, avroSchema);
            final String parquetFile = "/tmp/parquet/data.parquet";
            final Path path = new Path(parquetFile);
            ParquetWriter<GenericRecord> parquetWriter = new ParquetWriter(path, writeSupport, CompressionCodecName.SNAPPY, BLOCK_SIZE, PAGE_SIZE);
            final GenericRecord record = new GenericData.Record(avroSchema);
            record.put("id", 1);
            record.put("age", 10);
            record.put("name", "ABC");
            record.put("place", "BCD");
            parquetWriter.write(record);
            parquetWriter.close();
        }
    }
    

    avro_format.json,

    {
       "type":"record",
       "name":"Pojo",
       "namespace":"com.xx.test",
       "fields":[
          {
             "name":"id",
             "type":[
                "int",
                "null"
             ]
          },
          {
             "name":"age",
             "type":[
                "int",
                "null"
             ]
          },
          {
             "name":"name",
             "type":[
                "string",
                "null"
             ]
          },
          {
             "name":"place",
             "type":[
                "string",
                "null"
             ]
          }
       ]
    }
    

    希望这会有所帮助。

    【讨论】:

    • 好的。如果我有 winutils.exe,这可以工作(在 Windows 上)。我应该用不同的措辞来表达这个问题。我不认为我会在我想写(和读)的地方有可用的 winutils.exe。然而,正如所问的,这个答案(虽然我需要弄清楚阅读)。谢谢。
    • 我还应该补充一点,我发现您的答案中有一些已弃用的 API。我认为应该使用 Builders 来创建 AvroWriteSupport 和 ParquetWriter 对象。
    • 是的,不推荐使用构造函数而不是类。正如你所说,我们应该使用构建器。
    • 但在我们的例子中 ParquetWriter 只有一个抽象构建器。
    • 如果没有正确的“import”语句和依赖 jar,代码示例就不好。
    猜你喜欢
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多