目录
0 引 言
1 空字段赋值
2 时间类
3 条件判断
4 多行转一行(行转列)
5 一行变多行(列转行)
6 窗口函数
7 排名函数
8 json解析函数
9 url解析函数
10 小 结
本文针对hive进行数据分析时总结了工作中常用的查询函数及分析函数,并对每种函数的用法进行总结赋予案例,每种案例都具有详细的解释。文章主要以实践为主,紧紧围绕工作中常用的一些函数进行总结,更注重对函数的使用方法进行分析,其后的案例读者可自行尝试学习,具有借鉴意义。
(1)函数说明
1)NVL函数:给值为NULL的数据赋值,它的格式是NVL( string1, replace_with)。它的功能是如果string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值,如果两个参数都为NULL ,则返回NULL。
select nvl(name,-1) from test;
2)COALESCE函数: (expression_1, expression_2, ...,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值。如果所有的表达式都是空值,最终将返回一个空值。
hive> select coalesce(1,2);
OK
1
Time taken: 0.461 seconds, Fetched: 1 row(s)
hive> select coalesce(null,2);
OK
2
Time taken: 0.407 seconds, Fetched: 1 row(s)
hive> select coalesce(null,null,3);
OK
3
Time taken: 0.081 seconds, Fetched: 1 row(s)
hive> select coalesce(null,2,3);
OK
2
Time taken: 0.082 seconds, Fetched: 1 row(s)
hive> select coalesce(null,null);
OK
NULL
Time taken: 0.15 seconds, Fetched: 1 row(s)
select coalesce(name,-1) from test;
(1)date_format:格式化时间
hive> select date_format('2019-03-20','yyyy-MM-dd');
OK
2019-03-20
Time taken: 0.102 seconds, Fetched: 1 row(s)
(2)date_add:时间跟天数相加
hive> select date_add('2019-03-20',5);
OK
2019-03-25
Time taken: 0.084 seconds, Fetched: 1 row(s)
(3)date_sub:时间跟天数相减
hive> select date_sub('2019-03-20',5);
OK
2019-03-15
Time taken: 0.08 seconds, Fetched: 1 row(s)
(4)datediff:两个时间相减
hive> select datediff('2020-03-20','2019-12-24');
OK
87
Time taken: 0.078 seconds, Fetched: 1 row(s)
(5)from_unixtime:将时间戳转换成标准的时间
语法: from_unixtime(bigint unixtime,string format)
返回值: string
说明: 转化 UNIX 时间戳(从 1970-01-01 00:00:00 UTC 到指定时间的秒数)到当前时区的时间格式,默认的format是yyyy-MM-dd HH:mm:ss,可以指定别的。
输入:bigint的时间戳
输出:string格式化的时间
常用的转换方法如下:
from_unixtime(cast(substr(cast(msg_time as string),1,10) as bigint),'yyyy-MM-dd')
一般时间戳到毫秒13位的到hive中只能处理10位的到秒,因而用上述方法进行转换。
hive> select from_unixtime(cast(substr(cast(msg_time as string),1,10) as bigint),'yyyy-MM-dd') from dwd_iot_phm_trackcir_shock limit 1;
OK
2020-01-16
Time taken: 0.203 seconds, Fetched: 1 row(s)
(6) unix_timestamp:将标准的时间(年月日时分秒的格式,格式可以指定)转换为时间戳
语法: unix_timestamp(string date, string format)
返回值: bigint
说明: 转换 pattern 格式的日期到 UNIX 时间戳。如果转化失败,则返回NULL。默认的format是yyyy-MM-dd HH:mm:ss,可以指定别的。
输入值:格式化时间 String
返回值:时间戳 bigint
注意:输入时间必须是到秒级的时间,否则转换失败返回NULL
hive> select unix_timestamp('2020-03-18');
OK
NULL
Time taken: 0.113 seconds, Fetched: 1 row(s)
hive> select unix_timestamp('2020-03-18 13:15:20');
OK
1584508520
Time taken: 0.198 seconds, Fetched: 1 row(s)
CASE WHEN
1. 数据准备
name |
dept_id |
sex |
果子学长 |
A |
男 |
小眼睛 |
A |
男 |
宋小宝 |
B |
男 |
韦小宝 |
A |
女 |
凤姐 |
B |
女 |
如花姐 |
B |
女 |
2. 创建表
create table emp_sex(
name string,
dept_id string,
sex string)
row format delimited fields terminated by "\t";
3.加载数据
load data local inpath '/home/centos/dan_test/data.txt' into table emp_sex;
4.需求:求出不同部门男女各多少人
5. Hql代码如下:
select
dept_id,
sum(case sex when '男' then 1 else 0 end) male_count,
sum(case sex when '女' then 1 else 0 end) female_count
from
emp_sex
group by
dept_id;
结果如下: