对码当歌,猿生几何?

Hive学习笔记:Hive数据类型

环境:CentOS7
           hive-1.1.0-cdh5.14.0
           hadoop-2.6.0-cdh5.14.0
 

简单类型

数字类型
TINYINT(1字节,有符号整数,从-128至127)
SMALLINT(2字节,有符号整数,从-32,768至32,767)
INT / INTEGER(4字节,有符号整数,从-2,147,483,648到2,147,483,647)
BIGINT(8字节,符号整数,从-9,223,372,036,854,775,808至9,223,372,036,854,775,807)
FLOAT (4字节,单精度浮点数)
DOUBLE (8字节,双精度浮点数)
DOUBLE PRECISION  ( DOUBLE的别名,仅从 Hive 2.2.0开始提供)
DECIMAL(最大精度为38位,不指定小数位数的话,将会四舍五入到整数位,所以在定义的时候一定要定义精度,如(10,2))
NUMERIC(没有找到这个类型的相关说明) 

数字类型支持各种算术运算符,UDF和UDAF,如:正负,加减乘除,平均值,求和,计数,取模,三角函数,乘方开方、对数
对小数还有以下三种取整运算符
ROUND(x) :四舍五入。
CEILING(x) :返回大于该数的最小整数
FLOOR(x) :返回小于该数的最大整数

日期/时间类型
TIMESTAMP(yyyy-MM-dd'T'HH:mm:ss.SSS,精确到纳秒)
DATE(YYYY-­MM-­DD,仅存储日期)
INTERVAL(存储时间间隔,具体用法查看官档,目前用的不多)

UNIX_TIMESTAMP():返回UNIX时间戳(又称POSIX时间)
CURRENT_TIMESTAMP():返回当前时间戳
TO_DATE(timestamp):返回时间戳的日期
YEAR(timestamp/date):返回时间戳或日期中的年
MONTH(timestamp/date):返回时间戳或日期中的月
DAY(timestamp/date):返回时间戳或日期中的日
HOUR(timestamp/date):返回时间戳中的时
MINUTE(timestamp):返回时间戳中的分
SECOND(timestamp):返回时间戳中的秒
WEEKOFYEAR(timestamp/date):返回时间戳或日期在当前的周数
DATEDIFF(start_date,end_dat):返回结束日期减去开始日期的天数
DATE_ADD(date,n):返回日期加上n天后的日期
DATE_SUB(date,n):返回日期减去n天后的日期

字符串类型
STRING(可以用单引号或双引号表示字符串)
VARCHAR(长度为1-65535,使用该类型时必须指定最大长度,超过指定长度会直接截断字符串)
CHAR(定长字符串类型,最大长度为255,如果字符串本身小于定义的长度,将会用空格填充)

一些字符串常用函数
elt,返回第n个字符串 ,如SELECT elt(2, 'New York', 'Beijing', 'Toronto') FROM employee LIMIT 1;
assert_true,如果条件为false时抛出异常,如SELECT assert_true(work_place IS NULL) FROM employee;
isnull,用于检验值是否为空,如SELECT work_place, isnull(work_place) is_null, isnotnull(work_place) is_not_null FROM employee;
initcap(string A):返回首字母大写的字符串
upper(string A) ucase(string A):upper小写转大写,ucase大写转小写
trim(string A) ltrim(string A) rtrim(string A):trim去掉字符串两端的空格,ltrim去字符串左边的,rtrim去字符串右边的
substr(string A,n,length):从位置n开始,从字符串A中截取长度为length的字符串,这里要注意的是,无论n是0还是1,指向的都是第一个字符


杂项类型
BOOLEAN(取值为true/false)
BINARY(二进制,只支持与String的转换,如1011)

复杂类型
Array:ARRAY<data_type>,建表时需要使用collection items terminated by '|'子句指定数组元素间的分隔符
maps :MAP<primitive_type, data_type>,插入数据时需要以key=value的方式存在于数据源里,且跟数组一样要指定<k,v>对间的分隔符
STRUCT: STRUCT<col1:type1,col2,type2....>,用于存放一组数据,例如定义sex_age_name<sex:string,age:int,name:string>,然后里面的数据是[male,20,john]
union :UNIONTYPE<data_type, data_type, ...>,没有找到相关资料,以后补上,官档说的是支持仍不完整

SIZE函数:SIZE(colname),用于计算MAP、ARRAY中的数据量,如果size未知则返回-1。
ARRAY_CONTAINS函数:ARRAY_CONTAINS(col,value),检验列中是否包含指定值,返回boolean值。
SORT_ARRAY函数:SORT_ARRAY(col),用于对数组进行升序排序。

数据隐式转换表
1.png 

数据显式转换
可以使用CAST将一个数据类型转换为另一个数据类型,用法是cast(value as newtype),如果该值不能被转换,则cast会返回null,特别注意的是日期类型,只能在Date、String、Timestamp三种之间进行转换

数据类型转换结果
cast(date as date)不变
cast(timestamp as date)截断年月日
cast(string as date)如果字符串的格式是'YYYY-MM'DD',则返回日期,否则返回null
cast(date as timestamp)基于本地时区,返回对应日期值的午夜时间(0点)
cast(date as string)转换为格式是'YYYY-MM-DD'的字符串



 

 

 

 

 

 

 

参考:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-HiveDataTypes
https://www.cnblogs.com/MOBIN/p/5618747.html#6
https://blog.csdn.net/xiaoshunzi111/article/details/51911546

阅读更多