2016-09-27 69 views
3

有没有办法从java创建镶木地板文件?在java中创建镶木地板文件

我有内存中的数据(Java类),我想将它写入到parquet文件中,以便稍后从apache-drill中读取它。

有没有一个简单的方法来做到这一点,如插入数据到sql表中?

GOT IT

感谢您的帮助。

结合答案和这个link,我能够创建一个实木复合地板文件,并用钻头读回来。

+0

在您提供的示例中,您定义了架构。是否有可能在不知道架构的情况下编写代码? –

+0

我不知道,对不起。我正在使用预定义的模式 –

回答

6

ParquetWriter的构造器被弃用(1.8.1),但不ParquetWriter本身,你还可以通过它的内部延伸,抽象生成器子类创建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); 
    } 

    } 

如果你不想使用组和GroupWriteSupport(捆绑在木地板,但只是作为定意数据模型实现的例子),你可以去与Avro,Protocol Buffers或Thrift内存数据模型。下面是使用使用的Avro写木地板为例:

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> 

完整的示例here

+0

是否可以在不知道架构的情况下编写代码? –

+0

@ 7H3IN5ID3R no。你必须指定架构 – Igor

+0

是的,理解它。我的情况不同,事件流动有不同的架构。我可以使用大熊猫和快速镶木地板进行python转换。将寻找模式的责任交给Pandas。 –

2

几个可能的方式来做到这一点:

  • 使用Java库木地板直接从您的代码编写木地板。
  • 使用JDBC连接到Hive或Impala,并使用SQL插入数据。请注意,如果您逐一插入行,它将导致每个单独记录的单独文件,并会完全破坏性能。您应该立即插入批次的行,这并不重要,所以我不推荐这种方法。
  • 的数据保存到分隔的文本文件,然后就在任一配置单元或黑斑羚以下步骤:
    • 定义表在文本文件,以允许蜂巢/黑斑羚读取数据。我们称这个表为text_table。有关详细信息,请参阅Impala的Create Table Statement
    • 创建一个具有相同列的新表格,但将Parquet指定为其文件格式。我们称这个表为parquet_table
    • 最后做一个insert into parquet_table select * from text_table将文本文件中的所有数据复制到镶木地板表。
+2

我想使用第一个选项并使用ParquetWriter,但它被标记为@depricated。所以我去了ParquetFileWriter,但我找不到任何如何定义和使用它的例子。浏览一个csv会非常慢,因为实际上我想通过我的应用程序流入大量数据。所以我必须把它全写到csv然后转换它。 有没有第一个选项的例子? –