Parquet数据类型与Hive数据类型的映射对应规则是什么?
Parquet 标准数据类型到 Hive 数据类型映射规则
以下映射覆盖Parquet官方定义的所有物理类型、逻辑类型,为生产环境实测可用的对应规则:
基础物理类型默认映射
物理类型是Parquet底层实际存储的格式,没有额外逻辑标注时按以下规则映射:
BOOLEAN:对应HiveBOOLEAN,直接存储布尔真值/假值INT32:默认对应HiveINT(32位有符号整数)INT64:默认对应HiveBIGINT(64位有符号整数)FLOAT:对应HiveFLOAT(32位单精度浮点数)DOUBLE:对应HiveDOUBLE(64位双精度浮点数)BYTE_ARRAY:默认对应HiveBINARY(可变长字节数组)FIXED_LEN_BYTE_ARRAY:固定长度字节数组,默认对应HiveBINARY
带逻辑标注的类型映射
Parquet会在物理类型上附加逻辑类型标记,此时按实际语义映射:
- 整数类逻辑标注
- 标注为
INT(8, *)的INT32:对应HiveTINYINT(8位整数) - 标注为
INT(16, *)的INT32:对应HiveSMALLINT(16位整数) - 标注为
INT(32, *)的INT32:对应HiveINT(32位整数) - 标注为
INT(64, *)的INT64:对应HiveBIGINT(64位整数) - 标注为
UINT_8/UINT_16/UINT_32/UINT_64的无符号整数:低版本Hive无对应无符号类型,会映射为高一档的有符号整数(比如UINT_16映射为INT)避免溢出,Hive 3.x+可直接映射为对应位宽的整数类型
- 标注为
- 数值类逻辑标注
- 标注为
DECIMAL(p, s)的类型:无论底层用INT32(p<=9)、INT64(10<=p<=18)、BYTE_ARRAY/FIXED_LEN_BYTE_ARRAY(p>18)存储,统一对应HiveDECIMAL(p, s)
- 标注为
- 字符串类逻辑标注
- 标注为
STRING的BYTE_ARRAY:对应HiveSTRING(UTF-8编码文本) - 标注为
ENUM的BYTE_ARRAY:对应HiveSTRING,枚举值直接存为文本 - 标注为
JSON的BYTE_ARRAY:对应HiveSTRING,JSON文本原样存储 - 标注为
UUID的FIXED_LEN_BYTE_ARRAY(16):Hive无原生UUID类型,默认映射为BINARY,业务侧可通过UDF转为标准UUID格式的STRING
- 标注为
- 时间类逻辑标注
- 标注为
DATE的INT32:对应HiveDATE,值为1970-01-01起的天数偏移 - 标注为
TIMESTAMP(MILLIS, *)的INT64:对应HiveTIMESTAMP - 标注为
TIMESTAMP(MICROS, *)的INT64:Hive 3.x+对应TIMESTAMP,低版本需手动转码否则会识别为BIGINT - 标注为
TIMESTAMP(NANOS, *)的INT64:Hive无原生纳秒时间戳类型,默认映射为BIGINT存储原始纳秒值,转TIMESTAMP会损失精度 - 标注为
TIME(*, *)的类型:Hive无原生TIME类型,统一映射为STRING,格式化为HH:mm:ss[.fff/ffffff/fffffffff] - 标注为
INTERVAL的FIXED_LEN_BYTE_ARRAY(12):对应HiveINTERVAL,存储年月、天、毫秒三段时间间隔
- 标注为
- 二进制类逻辑标注
- 标注为
BSON的BYTE_ARRAY:对应HiveBINARY,BSON二进制数据原样存储
- 标注为
- 嵌套结构类型
LIST:对应HiveARRAYMAP:对应HiveMAP- 自定义结构
GROUP:对应HiveSTRUCT
兼容性提示:Hive 2.2及更早版本对Parquet新逻辑类型(比如纳秒时间戳、无符号整数)的支持不完善,读取时可能出现类型识别错误、值溢出问题,建议使用Hive 2.3+版本操作带复杂逻辑类型的Parquet文件,必要时可自定义SerDe指定映射规则。
内容的提问来源于stack exchange,提问作者Pavel Orekhov
相关产品推荐
相关产品推荐

