gpt4 book ai didi

Hive-Varchar vs String,如果存储格式为Parquet文件格式,有什么好处吗?

转载 作者:行者123 更新时间:2023-12-04 17:07:18 26 4
gpt4 key购买 nike

我有一个HIVE表,该表将容纳数十亿条记录,它是一个时间序列数据,因此分区是每分钟一次。每分钟我们将有大约一百万条记录。

我的表格中没有几个字段,VIN编号(17个字符),Status(2个字符)...等等

所以我的问题是在表创建期间,如果我选择使用Varchar(X)vs String,是否存在任何存储或性能问题,

varchar的一些限制是
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-string

  • 如果我们提供的字符超过“x”个,它将无提示地截断,因此
    保持字符串将是 future 的证明。
  • 非通用UDF无法直接使用varchar类型作为输入参数
    或返回值。可以改为创建字符串UDF,并且
    varchar值将转换为字符串并传递给UDF。
    要直接使用varchar参数或返回varchar值,
    创建一个GenericUDF。
  • 如果存在其他上下文,它们可能不支持varchar
    依靠基于反射的方法来检索类型信息。
    这包括一些SerDe实现。

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

    最佳答案

    让我们尝试了解如何在API中实现它:-

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

    这是魔术开始的地方->
    private DataWriter createWriter(ObjectInspector inspector, Type type) {
    case stmt.....
    ........
    case STRING:
    return new StringDataWriter((StringObjectInspector)inspector);
    case VARCHAR:
    return new VarcharDataWriter((HiveVarcharObjectInspector)inspector);

    }

    DataWritableWriter类的createWriter方法检查列的数据类型。即 varcharstring,因此会为这些类型创建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));
    }
    }



    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编码不同。明智的存储方式可能没有多少变化。的存储字节数。但是根据我的理解,性能是明智的, hive 是 schema on read工具。 ParquetRecordReader知道如何读取记录。它只读取字节,因此不会因varchar或字符串数​​据类型而导致任何性能差异。

    关于Hive-Varchar vs String,如果存储格式为Parquet文件格式,有什么好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45191793/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com