Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在不依赖Hadoop和HDFS的情况下使用Java读写拼花地板?_Java_Hadoop_Parquet_Apache Drill_Data Formats - Fatal编程技术网

是否可以在不依赖Hadoop和HDFS的情况下使用Java读写拼花地板?

是否可以在不依赖Hadoop和HDFS的情况下使用Java读写拼花地板?,java,hadoop,parquet,apache-drill,data-formats,Java,Hadoop,Parquet,Apache Drill,Data Formats,我一直在寻找这个问题的答案 在我看来,如果不引入对HDFS和Hadoop的依赖,就无法在Java程序中嵌入读取和写入拼花格式。这是正确的吗 我想在Hadoop集群之外的客户机上读写 我开始对ApacheDrill感到兴奋,但它似乎必须作为一个单独的进程运行。我需要的是使用拼花格式读写文件的过程中能力。您可以使用java拼花客户端API在hadoop集群外部编写拼花格式 下面是一个java示例代码,它将拼花地板格式写入本地磁盘 import org.apache.avro.Schema; impo

我一直在寻找这个问题的答案

在我看来,如果不引入对HDFS和Hadoop的依赖,就无法在Java程序中嵌入读取和写入拼花格式。这是正确的吗

我想在Hadoop集群之外的客户机上读写


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

您可以使用java拼花客户端API在hadoop集群外部编写拼花格式

下面是一个java示例代码,它将拼花地板格式写入本地磁盘

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();
    }
}

希望这有帮助。

好的。如果我有winutils.exe,这可以(在Windows上)工作。我应该用不同的措辞来回答这个问题。我不认为在我想写(和读)的地方会有winutils.exe。然而,正如被问到的,这是答案(尽管我需要找出答案)。谢谢。我还应该补充一点,我发现在你的答案中有一些不推荐的API。我认为它应该使用构建器来创建AvroWriteSupport和ParquetWriter对象。正如您所说的,我们应该使用构建器。但是在我们的例子中,ParquetWriter只有一个抽象的构建器。如果没有适当的“导入”语句和依赖项jar,代码示例是不好的。
{
   "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"
         ]
      }
   ]
}