Man*_*esh 5 hive hql hcatalog parquet
我有一个HIVE表,该表将保存数十亿条记录,它是一个时间序列数据,因此分区是每分钟一次。每分钟我们将有大约一百万条记录。
我表中的字段很少,VIN编号(17个字符),状态(2个字符)...等等
所以我的问题是在表创建期间,如果我选择使用Varchar(X)vs String,是否存在任何存储或性能问题,
varchar的一些限制是 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-string
如果我们提供的字符超过“ x”个,它将无提示地截断,因此将其保留为字符串将是将来的证明。
非通用UDF不能直接使用varchar类型作为输入参数或返回值。可以改为创建字符串UDF,并将varchar值转换为字符串并传递给UDF。要直接使用varchar参数或返回varchar值,请创建GenericUDF。
如果它们依赖于基于反射的方法来检索类型信息,则可能存在不支持varchar的其他上下文。这包括一些SerDe实现。
就存储和性能而言,我需要使用字符串而不是varchar付出的成本是多少?
让我们试着从它在 API 中的实现方式来理解:-
org.apache.hadoop.hive.ql.io.parquet.write.DataWritableWriter
Run Code Online (Sandbox Code Playgroud)
魔法开始了-->
private DataWriter createWriter(ObjectInspector inspector, Type type) {
case stmt.....
........
case STRING:
return new StringDataWriter((StringObjectInspector)inspector);
case VARCHAR:
return new VarcharDataWriter((HiveVarcharObjectInspector)inspector);
}
Run Code Online (Sandbox Code Playgroud)
DataWritableWriter 类的 createWriter 方法检查列的数据类型。即要么varcharor string,相应地它为这些类型创建 writer 类。
现在让我们继续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));
}
}
Run Code Online (Sandbox Code Playgroud)
或者
以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));
}
}
Run Code Online (Sandbox Code Playgroud)
这两个类中的addBinary方法实际上添加了编码数据类型(encodeUTF8 编码)的二进制值。对于字符串编码与 varchar 编码不同。
问题的简短回答:- string 和 varchar 的 unicode 编码是不同的。存储明智它可能几乎没有变化。存储的字节数。但根据我的理解,性能明智,蜂巢是schema on read工具。ParquetRecordReader知道如何读取记录。它只是读取字节。因此不会因 varchar 或 string 数据类型而产生任何性能差异。
最好的方法是使用String。varchar也在内部存储为字符串。如果您要确定数据类型,请根据需要在相同数据之上创建一个视图。
我看到的唯一区别是字符串是无限制的,最大值为32,767字节,而Varchar是有界的。如果不使用字符串,则字符串有效地限制了数据。
向量化支持也可用于String。
| 归档时间: |
|
| 查看次数: |
7129 次 |
| 最近记录: |