Hive QL内置数学函数、集合函数、类型转换函数
Hive提供有许多内置函数来帮助我们处理和查询数据,包括:
- 字符串操作函数
- 数据操作函数
- 类型转换函数
- 条件运算符函数
- 数学函数
官方文档参考:查看
请参考 Hive内置数学函数_集合函数_类型转换函数(视频教程)
一、Hive数学函数
数学函数:主要用于一些常用的数学计算。
-- round(四舍五入) -- 语法:round(DOUBLE a) 返回a的值,并对a四舍五入 -- round(DOUBLE a, INT d) 返回a的值,并按照d的值保留小数位和四舍五入 select round(46.5); select round(46.499); select round(12.3456,2); -- ceil(向上取整) -- 语法:ceil(DOUBLE a) -- ceiling(DOUBLE a) select ceil(87.2); select ceiling(87.1); select ceil(-23.98); -- floor(向下取整) -- 语法:floor(DOUBLE a) select floor(2.89); select floor(-2.89); -- rand()求取随机数 -- 语法:rand() 每行返回一个double型随机数 -- rand(INT seed) 每行返回一个double型随机数,整数seed是随机因子的种子; select rand(); select rand(100); -- 其他常用的数学函数 -- exp(DOUBLE d) 返回e的 d幂次方,返回double型; -- ln(DOUBLE d) 以自然数为底d的对数,返回double型; -- log10(DOUBLE d) 以10为底d的对数,返回double型; -- log2(DOUBLE d) 以2为底d的对数,返回double型; -- log(DOUBLE base, DOUBLE d) 以base为底d的对数,返回double型; -- pow(DOUBLE d, DOUBLE p) d的p次幂,返回double型; -- sqrt(DOUBLE d) d的平方根,返回double型; -- abs(DOUBLE d) 计算double型d 的绝对值,返回double型; -- sin(DOUBLE d) 返回d的正弦值,结果为double型; -- asin(DOUBLE d) 返回d的反正弦值,结果为double型; -- cos(DOUBLE d) 返回d 的余弦值,结果为double型; -- tan(DOUBLE d) 返回d的正切值,结果为double型; -- e() 数学常熟e,超越数; -- PI() 数学常数Pi,圆周率; -- -------------------------------------------------------------------------------------------------- -- 集合函数 -- 集合函数主要是对集合的操作处理。 -- size() 求长度 -- 语法:size(Map) -- size(Array ) -- 求map集合“1,'zhangsan',2,'lisi'”的长度: select size(map(1,'zhangsan',2,'lisi')); -- 求数组“1,'lisi',2”的长度: select size(array(1,'lisi',2)); -- map_keys() 返回map集合中的所有key -- 语法:map_keys(Map ) -- 求map集合“1,'zhangsan',2,'lisi'”的所有key select map_keys(map(1,'zhangsan',2,'lisi')); -- 类似的函数有map_values(Map ),返回map中的所有value select map_values(map(1,'zhangsan',2,'lisi')); -- array_contains() 判断数组中是否包含某个值 -- 语法:array_contains(Array , value) -- 判断数组中是否含有“逾期”,“违约”这两字符串 select array_contains(array('逾期','违约'), '违约'); select array_contains(array('逾期','违约'), '逾期'); select array_contains(array('逾期','违约'), '诚信'); -- sort_array() 按自然顺序对数组进行排序并返回 -- 语法:sort_array(Array ) -- 对数组“3,5,2,'z',4,'a'”和“3,5,2,4”分别排序 select sort_array(array(3,5,2,'z',4,'a')); -- ------------------------------------------------------------------------------------------------------ -- 类型转换函数 -- 将字符'3.56'转换为double数值类型 select cast('3.56' as double); -- 将字符串'2019-11-06'转换为date类型 select cast('2019-11-06' as date);
二、【示例】天气数据分析
下面这个示例中,我们将通过编写Hive QL查询语句,使用Hive字符串函数来处理天气数据,主要目的是熟悉Hive数学函数的使用。
气象传感器在全球各个地方每小时收集一次数据,并聚集为大量的日志数据,每个气象站每年一个数据压缩包。这非常适合使用MapReduce进行分析(半结构化数据,面向记录的) 本案例中使用NCDC(美国国家气象资料中心)的数据,这些数据使用一行一行的ASCII格式存储,每行一条记录。我们重点关注其中的温度值。
气象数据样本sample.txt:如下:
0067011990999991950051507004+68750+023550FM-12+038299999V0203301N00671220001CN9999999N9+00001+99999999999 0043011990999991950051512004+68750+023550FM-12+038299999V0203201N00671220001CN9999999N9+00221+99999999999 0043011990999991950051518004+68750+023550FM-12+038299999V0203201N00261220001CN9999999N9-00111+99999999999 0043012650999991949032412004+62300+010750FM-12+048599999V0202701N00461220001CN0500001N9+01111+99999999999 0043012650999991949032418004+62300+010750FM-12+048599999V0202701N00461220001CN0500001N9+00781+99999999999
年份和温度值如下度所示:
请按以下步骤执行:
1)创建存放天气日志数据的hive表
create table weather(line string);
2)加载数据文件到表中
load data inpath '/wd/wd-input/sample.txt' overwrite into table weather;
3)查询"年份"、"温度"值
select substr(line,16,4) as year,cast(substr(line,88,5) as int) as temp from weather;
4)查询每年的最高温度
select year,max(temp) from( select substr(line,16,4) as year, cast(substr(line,88,5) as int) as temp from weather ) as w group by year;