讓我們試着從它是如何在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方法。即varchar
或string
,因此它爲這些類型創建作者類。
現在讓我們繼續前往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或字符串數據類型而導致任何性能差異。
Varchar純粹是一個SQL構造。當您將配置單元表中的列定義爲varchar(x)時,您基本上將文件中的基礎數據類型轉換爲varchar。這是鑲木地板上的一根繩子。我從來沒有在Hive中將任何列聲明爲varchar。 – Andrew