我一直在寻找这个问题的解决办法。在我看来,如果不引入对hdfs和hadoop的依赖,就无法在java程序中嵌入读写parquet格式。是这样吗?我想在hadoop集群之外的客户机上读写。我开始对apachedrill感到兴奋,但它似乎必须作为一个单独的进程运行。我需要的是一个进程中的能力,读写一个文件使用Parquet格式。
qvtsj1bj1#
您可以使用javaparquet客户端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èu格式.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" ] } ] }
希望这有帮助。
1条答案
按热度按时间qvtsj1bj1#
您可以使用javaparquet客户端api在hadoop集群外部编写parquet格式。
下面是java中的一个示例代码,它将Parquet格式写入本地磁盘。
avroèu格式.json,
希望这有帮助。