2016-09-27 41 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然後轉換它。 有沒有第一個選項的例子? –

相關問題