Hive-Varchar vs String,如果存储格式为Parquet文件格式,是否有任何优势

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

  1. 如果我们提供的字符超过“ x”个,它将无提示地截断,因此将其保留为字符串将是将来的证明。

    1. 非通用UDF不能直接使用varchar类型作为输入参数或返回值。可以改为创建字符串UDF,并将varchar值转换为字符串并传递给UDF。要直接使用varchar参数或返回varchar值,请创建GenericUDF。

    2. 如果它们依赖于基于反射的方法来检索类型信息,则可能存在不支持varchar的其他上下文。这包括一些SerDe实现。

就存储和性能而言,我需要使用字符串而不是varchar付出的成本是多少?

sya*_*dav 8

让我们试着从它在 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 数据类型而产生任何性能差异。


lon*_*tar 5

最好的方法是使用String。varchar也在内部存储为字符串。如果您要确定数据类型,请根据需要在相同数据之上创建一个视图。

我看到的唯一区别是字符串是无限制的,最大值为32,767字节,而Varchar是有界的。如果不使用字符串,则字符串有效地限制了数据。

向量化支持也可用于String。