是否可以在不依赖 Hadoop 和 HDFS 的情况下使用 Java 读写 Parquet?
Is it possible to read and write Parquet using Java without a dependency on Hadoop and HDFS?
我一直在寻找这个问题的解决方案。
在我看来,如果不依赖 HDFS 和 Hadoop,就无法在 Java 程序中嵌入读写 Parquet 格式。这个对吗?
我想在 Hadoop 集群之外的客户端机器上读写。
我开始对 Apache Drill 感到兴奋,但它似乎必须 运行 作为一个单独的进程。我需要的是使用 Parquet 格式读写文件的进程内能力。
您可以使用 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"
]
}
]
}
希望对您有所帮助。
我一直在寻找这个问题的解决方案。
在我看来,如果不依赖 HDFS 和 Hadoop,就无法在 Java 程序中嵌入读写 Parquet 格式。这个对吗?
我想在 Hadoop 集群之外的客户端机器上读写。
我开始对 Apache Drill 感到兴奋,但它似乎必须 运行 作为一个单独的进程。我需要的是使用 Parquet 格式读写文件的进程内能力。
您可以使用 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"
]
}
]
}
希望对您有所帮助。