上一篇文章「数据分析sql入门篇-hive sql常用数据类型大全」主要对hive中的数据类型(基本数据类型+复杂数据类型)做了详细的介绍,在有了数据类型的知识储备后,接下来需要对hive中的「数据类型如何转换」有一个基本的理解,这篇文章我会对数据类型范围大小、数据类型转换的前提条件、数据类型如何转换以及数据类型转换函数做一个详细的介绍,以便更好的帮助大家对hive中的数据类型有一个更加全面的学习和理解,为后面的hql学习做准备。
hive中数据类型转换可以分为隐式转换和显式转换。
所谓隐式转换是指自动转换数据类型,不需要做任何的操纵即可转换,不是所有类型的数据都可以进行隐式转换的,这跟数据类型和数据范围都有关系。而显式转换是指强制转换数据类型,是需要使用指定的数据类型转换函数cast进行操作的。
接下来,我会对隐式转换数据类型的规则和显式转换数据类型的函数cast做一个基本介绍。
一、隐式转换:
1、场景分析:
先给出一个数据场景,以便大家更好的理解什么是隐式转换,具体如下:
假如hive数据库中存在一张销售订单表tb_sales_order,其中一个字段是payment_amount支付金额,数据类型是float,还有一个字段quantity销售数量,数据类型是int,当需要计算件单价时,需要用到支付金额/销售数量,这个时候int类型的数据会自动地转换为float类型,以保证两个字段的数据格式相同从而可以运算。
需要注意的是,hive中不能隐式地将一个 float类型的数据自动转换成int类型或bigint类型或者范围更小的类型数据,这时将会返回错误。
2、隐式类型转换规则:
hive中的原子数据类型(即:基础数据类型)是可以进行隐式转换的。在需要的时候,会对整数类型的数据进行隐式转换。任何整数类型都可以隐式地转换成一个范围更大的类型。
例如:当有int类型的数据和float类型的数据进行互相计算时,int类型的数据会自动地转换为float类型。
隐式类型转换规则:
1)任何整数类型都可以隐式地转换为一个范围更大的类型,例如:tinyint可以转换成int,int也可以转换成bigint;
2)所有整数类型、float和string类型都可以隐式地转换成double类型;
3)tinyint、smallint、int都可以转换为float;
4)boolean类型是不可以转换为任何其它的类型。
说明:string类型可以隐式地转换成double类型,数据需要是数字型的,例如:"12"可以转换为12.0,但是"ABC"是不可以转换为double的。
3、数据类型范围大小:
大小顺序如下:tinyint < smallint < int < bigint< float < double
当有以上所示不同数据类型的字段进行互相运算时,hive会自动地将值范围较小的数据类型转为值范围较大的数据类型,以保证两个字段的数据格式相同从而可以运算。
二、显式转换:
使用cast函数可以显式的将一种类型的数据转换成另一种类型的数据。
语法:
cast(value as type)
说明:value是需要转换数据类型的字段,type是需要转换的数据类型。
关于使用cast函数进行数据类型转换,有以下几点需要说明:
1)不是所有类型的数据都能通过cast函数进行转换的,需要符合“转换后的数据类型的存储类型值”的条件才可以进行转换,例如:"2021-06-21"字符串型可以转换成date日期型,而"abc"转换成int,则不符合条件,会返回NULL;
案例:将"abc"转换为float型的数据,会返回NULL。
select cast("abc" as float);
结果:
2)大范围的数据类型转换为小范围的数据类型时,cast函数是直接截取的,要注意由于数据精确度导致的数据误差结果,例如:将浮点型的数据转换成int类型的,内部操作是通过round()或者floor()函数来实现的。
3)对于binary类型的数据,只能将binary类型的数据转换成string类型,如果是数字型的数据,可再次进行转换为整数型。
例如:比如a是一个binary,且它是一个数字型,那么你可以用下面的查询进行转换。
select (cast(cast(a as string) as double));
4)对于date类型的数据,只能在date、timestamp以及string之间进行转换,下面罗列出了详细的使用方法操作。
转换方法 | 说明 |
cast(date as date) | 返回date类型。 |
cast(timestamp as date) | timestamp中的年/月/日的值是依赖于地时区的,返回date类型。 |
cast(string as date) | 如果string是YYYY-MM-DD格式的,则相应的年/月/日的date类型的数据将会返回;如果string不是YYYY-MM-DD格式的,则会返回NULL。 |
cast(date as timestamp) | 基于当地的时区,生成一个对应date的年/月/日的时间戳值。 |
cast(date as string) | date所代表的年/月/日时间将会转换成YYYY-MM-DD的字符串。 |
案例1:大范围的数据类型转换为小范围的数据类型时,cast函数是直接截取的。
分别将12.2、12.5和12.9转换为int类型,对比查看结果。
select cast(12.2 as int);
select cast(12.5 as int);
select cast(12.9 as int);
通过以上查询结果可知,12.2、12.5和12.9转换为int类型时,cast函数是直接截取数据的,结果都为12。
案例2:使用cast函数将字符串类型的非数字型的数据转换为数值型。
select cast("abc" as float);
结果如下:
你会发现,非数字型的字符串强制转换为数值型,系统会报错,也就是说只有字符串类型的数字型的数据才可以转换为数值型。
案例3:使用cast函数将字符串类型的数字型的数据转换为数值型。
select cast('12' as int) + 10;
结果:
使用cast将字符串类型的'12'转换为int类型时,计算结果也是int类型。
对比一下这行代码的查询结果:
select '12'+ 10;
结果:
这里我们并没有对字符串类型的'12'进行转化,hive会自动地将'12'转换为double,计算结果也是double类型。
案例4:使用cast函数将字符串类型的日期数据转换为日期型。
将字符串类型YYYY-MM-DD格式的'2021-06-22'转换为date类型,进行日期计算。
select current_date - cast('2021-06-22' as date);
结果如下:
通过以上结果可知,将字符串类型YYYY-MM-DD格式的数据转换为date类型之后,可以进行日期的计算。
对比以下代码的查询结果:
select current_date - '2021-06-22';
查询结果:
通过如上结果发现,字符串类型YYYY-MM-DD格式的数据,如果不转换为日期类型的数据,则无法跟日期类型的数据进行对比计算,系统会报错。
这篇文章主要对hive中数据类型范围大小、数据类型转换的前提条件、数据类型如何转换以及数据类型转换函数cast做一个详细的介绍,文中也给出了一系列具有对比意义的案例,以便大家更好的理解hive中的隐式转换和显式转换,通过这篇文章的学习,希望能够帮助大家对hive中的数据类型有一个更加全面的学习和理解,为后面的hive学习做准备。
如果你正在学习hive,可以收藏起来以备不时之需,欢迎小伙伴们留言,一起讨论,共同进步。
寄语:
我爱生活,喜欢记录生活中的点滴;
我爱向日葵,喜欢看着她朝着太阳微笑的样子,甚是可爱温暖。