点击上方「数据分析师的FIRE人生」→
点击右上角「...」→设为星标⭐

大家好,我是风影楼,一名互联网公司的数据分析师。之前我曾在CSDN编写了Hive系列的付费博客专栏,目前收获了25W次的访问,不过由于CSDN的付费设置无法取消,所以我决定在公众号重新免费分享一遍。第一篇就从Hive数据类型开始介绍。
1.常用基本数据格式
TINYINT 1byte有符号整数
范围及举例:[-128 , 127]
SMALINT 2byte有符号整数
范围及举例:[-32768 , 32767]
INT 4byte有符号整数
范围及举例:
[-2147483648 , 2147483647]
BIGINT 8byte有符号整数
范围及举例:
[-9223372036854775808 , 9223372036854775807]
BOOLEAN 布尔
范围及举例:true/false
FLOAT 4byte单精度浮点数
范围及举例:
[-3.40E+38 , +3.40E+38]
DOUBLE 8byte双精度浮点数
范围及举例:
[-1.79E+308 , +1.79E+308]
STRING 字符序列,可用单引号或双引号
范围及举例:'abc',"abc "
TIMESTAMP 整数、浮点数或字符串
范围及举例:
1.整数:1327882394(Unix新纪元秒)
2.浮点数:1327882394.123456789(Unⅸ新纪元秒并跟随有纳秒数)
3.字符串: '2019-04-10 12:34:56.123456789'
另Hive的基本数据类型还包括一个BINARY,但工作中基本接触不到,故不在此介绍,感兴趣的同学可自行百度。
2. 常用的集合数据类型
ARRAY
数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为['A','B',],那么第2个元素可以通过数组名[1]进行引用
举例:
X[1,2,3]
X[0]=1
X[1]=2
X[2]=3
另Hive有集合数据类型还包括STRUCT,MAP,但工作中基本接触不到,故不在此介绍,感兴趣的同学可自行百度。
3. Hive和其他SQL的数据格式有何区别
在其他SQL方言中,通常会提供限制最大长度的“字符数组”(也就是很多字符串)类型,但Hive中不支持这种数据类型。
关系型数据库提供这个功能是出于性能优化的考虑。因为定长的记录更容易进行建立索引,数据扫描,等等。
在Hive所处的“宽松”的世界里,不一定拥有数据文件但必须能够支持使用不同的文件格式,Hive根据不同字段间的分隔符来对其进行判断。同时, Hadoop和Hive强调优化磁盘的读和写的性能,而限制列的值的长度相对来说并不重要。
4. TIMESTAMP
新增数据类型 TIMESTAMP的值可以是整数,也就是距离Unix新纪元时间(1970年1月1日,午夜12点)的秒数;也可以是浮点数,即距离Unix新纪元时间的秒数,精确到纳秒(小数点后保留9位数);还可以是字符串,即JDBC所约定的时间字符串格式,格式为YYYY-MM-DD hh:mm:ss.fffff
5. 数据类型转换
5.1 显式转换
使用cast函数可以对指定的值进行数据类型转换。
cast(value AS TYPE)
value是需要被转换的数据, AS是固定关键字,type是需要转换的类型
常用转换一般是数字类型和字符串之间进行互转,如:
cast(2019 AS STRING)
cast('2019' AS INT)
当然cast的转换功能也不是万能的,必须是“存储的类型值”符合转换条件才能进行转换,否则会返回NULL,比如“XYZ”转换成FLOAT,很明显XYZ不是数值,所以转换失败,结果返回NULL值。
此外,如果使用cast将值范围较大的数据类型转换成值范围较小的数据类型,cast函数会直接截取,损失数据精度甚至得到错误结果,需要慎用。
5.2 隐式转换
当有以下不同数据类型的列互相运算时,Hive会自动把值范围较小的数据类型转为值范围较大的数据类型。
大小顺序如下:
TINYINT < SMALINT < INT < BIGINT < FLOAT < DOUBLE
虽然Hive自带隐式转换功能,但是不同数据类型进行join时有可能引发数据倾斜,建议尽量使用cast函数进行格式转换后再join。




