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数学函数的使用。

请参考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;

《Spark原理深入与编程实战》