hive中数据类型的转化CAST

在《Hive内置数据类型》文章中,我们提到了Hive内置数据类型由基本数据类型和复杂数据类型组成。今天的话题是Hive数据类型之间的转换。同Java语言一样,Hive也包括隐式转换(implicit conversions)和显式转换(explicitly conversions)。   Hive在需要的时候将会对numeric类型的数据进行隐式转换。比如我们对两个不同数据类型的数字进行比较,假如一个数据类型是INT型,另一个是SMALLINT类型,那么SMALLINT类型的数据将会被隐式转换地转换为INT类型,这个到底和Java中的一样;但是我们不能隐式地将一个 INT类型的数据转换成SMALLINT或TINYINT类型的数据,这将会返回错误,除非你使用了CAST操作。   任何整数类型都可以隐式地转换成一个范围更大的类型。TINYINT,SMALLINT,INT,BIGINT,FLOAT和STRING都可以隐式地转换成DOUBLE;是的你没看出,STRING也可以隐式地转换成DOUBLE!但是你要记住,BOOLEAN类型不能转换为其他任何数据类型!

  下标列出了Hive内置的数据类型之间是否可以进行隐式的转换操作:

bl

tinyint

si

int

bigint

float

double

dm

string

vc

ts

date

ba

boolean

true

false

false

false

false

false

false

false

false

false

false

false

false

tinyint

false

true

true

true

true

true

true

true

true

true

false

false

false

smallint

false

false

true

true

true

true

true

true

true

true

false

false

false

int

false

false

false

true

true

true

true

true

true

true

false

false

false

bigint

false

false

false

false

true

true

true

true

true

true

false

false

false

float

false

false

false

false

false

true

true

true

true

true

false

false

false

double

false

false

false

false

false

false

true

true

true

true

false

false

false

decimal

false

false

false

false

false

false

false

true

true

true

false

false

false

string

false

false

false

false

false

false

true

true

true

true

false

false

false

varchar

false

false

false

false

false

false

true

true

true

true

false

false

false

ts

false

false

false

false

false

false

false

false

true

true

true

false

false

date

false

false

false

false

false

false

false

false

true

true

false

true

false

binary

false

false

false

false

false

false

false

false

false

false

false

false

true

  注:由于表格比较大,这里对一些比较长的字符串进行缩写,ts是timestamp的缩写,bl是boolean的缩写,sl是smallint的缩写,dm是decimal的缩写,vc是varchar的缩写,ba是binary的缩写。

  我们可以用CAST来显式的将一个类型的数据转换成另一个数据类型。如何使用?CAST的语法为cast(value AS TYPE)。举个例子:假如我们一个员工表employees,其中有name、salary等字段;salary是字符串类型的。有如下的查询:

1

SELECT name, salary FROM employees

2

WHERE cast(salary AS FLOAT) <</code>100000.0;

  这样salary将会显示的转换成float。如果salary是不能转换成float,这时候cast将会返回NULL!   对cast有一下几点需要说明的:   (1)、如果将浮点型的数据转换成int类型的,内部操作是通过round()或者floor()函数来实现的,而不是通过cast实现!   (2)、对于BINARY类型的数据,只能将BINARY类型的数据转换成STRING类型。如果你确信BINARY类型数据是一个数字类型(a number),这时候你可以利用嵌套的cast操作,比如a是一个BINARY,且它是一个数字类型,那么你可以用下面的查询:

1

SELECT (cast(cast(a as string) asdouble)) from src;

我们也可以将一个String类型的数据转换成BINARY类型。   (3)、对于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的字符串

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏琯琯博客

排序算法-快速排序

排序算法-快速排序 <?php /** * 快速排序. * * @param array $value 待排序数组 * @param array $...

35280
来自专栏PHP在线

使用MySQL正则表达式 __MySQL必知必会

正则表达式作用是匹配方本,将一个模式(正则表达式)与一个文本串进行比较。 MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定用正则表达式过滤SE...

38290
来自专栏JetpropelledSnake

在Python中实现单例模式

有些时候你的项目中难免需要一些全局唯一的对象,这些对象大多是一些工具性的东西,在Python中实现单例模式并不是什么难事。以下总结几种方法: 使用类装饰器 ...

32660
来自专栏web前端教室

javascript 红皮高程(13)

复习下昨天的一元操作符中的递增和递减操作符,++和-- 只能操作一个值的操作符叫做一元操作符。 它的规则主要在37页, (1)应用于不包括数字的字符串时,将把变...

215100
来自专栏lgp20151222

js遍历 for-of

10420
来自专栏PHP在线

Array数组函数(一)

array_change_key_case--返回字符串键名全为小写或大写的数组 array_change_key_case(array$input[,...

377140
来自专栏码匠的流水账

聊聊base62与tinyURL

base64大家肯定是很熟悉了,那base62是什么东东,它常被用来做短url的映射。

16520
来自专栏谈补锅

C语言之冒泡排序、选择排序、折半查询、进制查表

22930
来自专栏dotnet & java

用泛型来实现编译时期的类型推断

第一章都是讲泛型的,距离上一篇Effective C#的随笔已经是很久以前的事情了。。。

8930
来自专栏desperate633

浅谈程序设计中的位操作什么是位操作位操作的常用技巧位操作的应用,常见的算法题小结

位操作是一种很底层的操作二进制数据的方法,虽然比较难掌握,但是有时候却有更高的效率和难以名状的优雅感。而且,在面试或者笔试中,考察基本的位操作应用越老越普遍,所...

6110

扫码关注云+社区

领取腾讯云代金券