1. 整体概述
注意:
- Hive的
String
类型,是一个可变的字符串,不能声明字符串长度。理论上可以存储2GB的字符。decimal
用于存储精确的小数,通常用于存储钱。第一个数字定义了这个小数的总的数字位数(包括小数点左侧和右侧的数字)。第二个数字定义了小数点右侧的数字位数。
例子:decimal(38, 0)定义了一种可以存储最多38位数字且没有小数的数据类型。- 所有的基本数据类型,包括
string
和timestamp
类型都是可比较大小的。
2. 集合数据类型详细说明
注意:map是特殊的struct,struct中元素两两一组就是map
- 定义集合数据类型
- 集合数据类类型相关总结
- 【Hive】array相关的函数总结 『数组 | 数组与元素 | 两个数组』
- map:https://blog.csdn.net/weixin_43597208/article/details/126962317
-- str_to_map(字符串参数, 分隔符1, 分隔符2) -- 使用两个分隔符将字符串拆分为键值对。 -- 分隔符1将文本分成K-V对,分隔符2分割每个K-V对。对于分隔符1默认分隔 符是 ',',对于分隔符2默认分隔符是 '=' -- 注意:不使用于 json 字符串 select str_to_map( concat_ws(',',collect_set(concat(source_key,":",source_value)),collect_set(concat("name",":",name))), ",", ":" )
- struct
3. 类型转换
-
自动类型转换:如果插入或修改数据时,数据类型与表中定义的数据类型不一致,会进行隐式转换。规则如下:
- 和java自动类型转换一样:
tinyint
->smalint
->int
->bigint
->float
->double
boolean
类型不可以转换为任何其他类型数字样式的string
与数字类型的数
进行运算时,会转成数字类型。-
所以,数字类型的字符串在参与运算时,无论是
=
还是!=
还是>
还是<
等等运算,都需要注意。特别是空字符串与数字运算,结果必为null,因为空字符串转为数字类型一定会转换失败,返回null
,null
与任何运算结果都为null
-
转换规则如下:
验证过程:-- Spark2.1 版本 select "2697000000.00" > 0; ------- |true | ------- explain select "2697000000.00" > 0; ----------------------------------------------------------------------------- |*Project [true AS (CAST(2697000000.00 AS DOUBLE) > CAST(0 AS DOUBLE))#17]. | |+- Scan OneRowRelation[] | ----------------------------------------------------------------------------- -- Spark2.4 版本 select "2697000000.00" > 0; ------- |NULL | ------- explain select "2697000000.00" > 0; ----------------------------------------------------------------------------- |**(1) Project [null AS (CAST(2697000000.00 AS INT) > 0)#2] | +- Scan OneRowRelation[] | -----------------------------------------------------------------------------
-
- 和java自动类型转换一样:
-
强制类型转换:插入或修改数据时,手动将某数据类型强转为某数据类型。使用CAST函数:
注意:无论是隐式转换,还是显示转换。只要转换不成功,都返回
NULL
4. NULL
-
hive中任何数与 null 进行运算,结果都为 null
包括
col_name not in ('aaa', null)
这种运算结果也为null,括号中只要有一个元素为null
,则运算结果为null。
只能写成col_name is not null and col_name not in ('')
-
判空要使用:xxx is null 或 xxx is not null
-
运算异常结果为null,比如:5 / 0 = null
-
sum、max、min、count里面有null
-
任何数据类型都可以为null
-
NULL是一种特殊的值,对某字段使用distinct 关键字时,NULL和一般值一样,都会排重,只保留一个值。
-
null 与 空字符串:null 是占空间的,空字符串是不占空间的。