2017-07-19 77 views
1

我有一個HIVE表,它將保存數十億條記錄,其時間序列數據,因此分區是每分鐘。每分鐘我們將有大約100萬條記錄。配置單元 - Varchar vs字符串,如果存儲格式是Parquet文件格式,是否有任何優勢

我有我的表,VIN碼(17個字符),狀態(2個字符)...等幾個領域

所以我的問題是創建表時,如果我選擇使用VARCHAR(X)VS串,是否有任何存儲或性能問題,

VARCHAR的限制很少被 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-string

  1. 如果我們提供比「X」字符,它會悄悄地截斷,更使 保持它的字符串是未來的證明。

    1. 非通用UDF不能直接使用varchar類型作爲輸入參數 或返回值。可以創建字符串UDF,而將varchar值轉換爲字符串並傳遞給UDF。 要直接使用varchar參數或返回varchar值, 將創建GenericUDF。

    2. 可能有其他上下文不支持varchar,如果他們 依賴基於反射的方法來檢索類型信息。 這包括一些SerDe實現。

什麼是我必須爲此付出代價在存儲方面使用字符串,而不是爲varchar和性能

+1

Varchar純粹是一個SQL構造。當您將配置單元表中的列定義爲varchar(x)時,您基本上將文件中的基礎數據類型轉換爲varchar。這是鑲木地板上的一根繩子。我從來沒有在Hive中將任何列聲明爲varchar。 – Andrew

回答

1

最好的辦法就是去與字符串的成本。 varchar也在內部存儲爲字符串。如果您想確定數據類型,請根據需要在相同數據的基礎上創建視圖。

T我唯一的區別是String是無界的,最大值爲32,767字節,Varchar有界。字符串有效地限制數據,如果它不使用它。

矢量化支持也可用於字符串。

1

讓我們試着從它是如何在API實現的瞭解: -

org.apache.hadoop.hive.ql.io.parquet.write.DataWritableWriter 

這裏是神奇的開始 - DataWritableWriter類檢查的列的數據類型>

private DataWriter createWriter(ObjectInspector inspector, Type type) { 
case stmt..... 
........ 
case STRING: 
     return new StringDataWriter((StringObjectInspector)inspector); 
    case VARCHAR: 
     return new VarcharDataWriter((HiveVarcharObjectInspector)inspector); 

} 

createWriter方法。即varcharstring,因此它爲這些類型創建作者類。

現在讓我們繼續前往VarcharDataWriter類。

private class VarcharDataWriter implements DataWriter { 
    private HiveVarcharObjectInspector inspector; 

    public VarcharDataWriter(HiveVarcharObjectInspector inspector) { 
     this.inspector = inspector; 
    } 

    @Override 
    public void write(Object value) { 
     String v = inspector.getPrimitiveJavaObject(value).getValue(); 
     recordConsumer.addBinary(Binary.fromString(v)); 
    } 
    } 

OR

StringDataWriter到類

private class StringDataWriter implements DataWriter { 
    private StringObjectInspector inspector; 

    public StringDataWriter(StringObjectInspector inspector) { 
     this.inspector = inspector; 
    } 

    @Override 
    public void write(Object value) { 
     String v = inspector.getPrimitiveJavaObject(value); 
     recordConsumer.addBinary(Binary.fromString(v)); 
    } 
    } 

addBinary方法在兩個類實際上增加了編碼的數據類型(encodeUTF8編碼)的二進制值。對於字符串編碼與varchar的編碼不同。

問題的簡短回答: -字符串和varchar的unicode編碼是不同的。存儲方面,它可能幾乎沒有任何變化。的商店字節數。但根據我的理解性能明智,配置單元是schema on read工具。 ParquetRecordReader知道如何讀取記錄。它只是讀取字節。因此,不會因爲varchar或字符串數​​據類型而導致任何性能差異。

相關問題