Hive 数据类型

Hive数据类型详解

Hive 中的数据类型指的是Hive表中的列字段类型。

Hive 数据类型整体分为两个类别:原生数据类型(primitive data type)和复杂数据类型(complex data type)。

  • 原生数据类型包括: 数值类型、时间类型、字符串类型、杂项数据类型;

  • 复杂数据类型包括: array数组、map映射、struct结构、union联合体。

image-20211114164642036

关于Hive的数据类型,需要注意:

  • 英文字母大小写不敏感;
  • 除 SQL 数据类型外,还支持 Java 数据类型,比如:string;
  • int 和 string 是使用最多的,大多数函数都支持;
  • 复杂数据类型的使用通常需要和分隔符指定语法配合使用。
  • 如果定义的数据类型和文件不一致,Hive 会尝试隐式转换,但是不保证成功。

原生数据类型

Hive支持的原生数据类型如下图所示:

image-20211114164829400

  1. 数值类型
    • ByteType: 表示 1 字节长的有符号整型,数值范围 : -128 到 127。
    • ShortType: 表示 2 字节长的有符号整型,数值范围 : -32768 到 32767。
    • IntegerType: 表示 4 字节长的有符号整型,数值范围 : -2147483648 到 2147483647。
    • LongType: 表示 8 字节长的有符号整型,数值范围 : -/* 9223372036854775808
    • FloatType: 表示 4 字节长的单精度浮点数。
    • DoubleType: 表示 8 字节长的双精度浮点数
    • DecimalType: 表示任意精度有符号带小数的数值。内部使用 java.math.BigDecimal,一个BigDecimal 由一个任意精度的整数非标度值和一个 32 位的整数标度 (scale) 组成。
  2. 字符串类型
    • StringType: 表示字符串值
  3. 二进制类型
    • BinaryType: 表示字节序列值
  4. 布尔类型
    • BooleanType: 表示布尔值
  5. 日期类型
    • TimestampType: 表示包含年月日、时分秒等字段的日期值,如 2014-12-12 12:34:56
    • DateType: 表示包含年月日字段的日期值
  6. 复杂类型(Complex types)
    • ArrayType(elementType, containsNull): 数组类型,表示一个由类型为 elementType 的元素组成的序列,containsNull 用来表示 ArrayType 中的元素是否能为 null 值。
    • MapType(keyType, valueType, valueContainsNull): 映射类型,表示一个键值对的集合。键的类型由 keyType 表示,值的类型则由 valueType 表示。对于一个 MapType 值,键是不允许为 null值。valueContainsNull 用来表示一个 MapType 的值是否能为 null 值
    • StructType(fields): 表示由 StructField 序列描述的结构
    • StructField(name, datatype, nullable): 表示 StructType 中的一个字段,name 表示字段名,datatype 是字段的数据类型,nullable 用来表示该字段是否可以为空值。

其中标注的数据类型是使用,详细的描述请查询语法手册:

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types

复杂数据类型

Hive 支持的复杂数据类型如下图所示:

image-20211114164958529

其中标注的数据类型是使用,详细的描述请查询语法手册:

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types

数据类型隐式、显示转换

与SQL类似,HQL支持隐式和显式类型转换。原生类型从窄类型到宽类型的转换称为隐式转换,反之,则不允许。

下表描述了类型之间允许的隐式转换:

image-20211114165055682

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types

显式类型转换使用CAST函数。

例如,CAST('100'as INT 会将100字符串转换为100整数值。如果强制转换失败,例如 CAST('INT'as INT),该函数返回 NULL。

image-20211114165125205

Python 与 Hive 数据类型映射

Python → Hive

1
2
3
4
5
6
7
8
9
10
11
12
_type_mappings = {
type(None): NullType,
bool: BooleanType,
int: LongType,
float: DoubleType,
str: StringType,
bytearray: BinaryType,
decimal.Decimal: DecimalType,
datetime.date: DateType,
datetime.datetime: TimestampType,
datetime.time: TimestampType,
}

Hive → Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
_acceptable_types = {
BooleanType: (bool,),
ByteType: (int, long),
ShortType: (int, long),
IntegerType: (int, long),
LongType: (int, long),
FloatType: (float,),
DoubleType: (float,),
DecimalType: (decimal.Decimal,),
StringType: (str, unicode),
BinaryType: (bytearray,),
DateType: (datetime.date, datetime.datetime),
TimestampType: (datetime.datetime,),
ArrayType: (list, tuple, array),
MapType: (dict,),
StructType: (tuple, list, dict),
}

Hive-Java类型对应

Hive数据类型 Java数据类型 Hadoop数据类型
string java.lang.String org.apache.hadoop.io.Text`
int java.lang.Integer org.apache.hadoop.io.IntWritable`
boolean java.lang.Boolean org.apache.hadoop.io.BooleanWritable`
array<type> java.util.List<Java type>
map<ktype, vtype> java.util.Map<Java type for K, Java type for V>
struct Don't use Simple UDF, use GenericUDF

Hive 数据类型
https://flepeng.github.io/045-Hive-31-字段-Hive-数据类型/
作者
Lepeng
发布于
2025年2月1日
许可协议