一、时间处理类
1、把固定日期转换成时间戳
select unix_timestamp('2020-05-29','yyyy-MM-dd') --返回结果 1590681600
select unix_timestamp('20200529','yyyyMMdd') --返回结果 1590681600
select unix_timestamp('2020-05-29T13:12:23Z', "yyyy-MM-dd'T'HH:mm:ss'Z'") --返回结果 1590729143
select unix_timestamp('2020-05-29 13:12:23', 'yyyy-MM-dd HH:mm:ss') --返回结果 1590729143
2、把 29/May/2020:11:30:03 +0800 转成正常格式(yyyy-MM-dd hh:mm:ss)
select from_unixtime(to_unix_timestamp('29/May/2020:11:30:03 +0800', 'dd/MMM/yyy:HH:mm:ss Z'))
--返回结果 2020-05-29 11:30:03
3、时间戳转换成固定日期
select from_timestamp(now(),'yyyyMM') --返回结果 202309
select from_unixtime(1590681600,'yyyy-MM-dd') --返回结果 2020-05-29
select from_unixtime(1590681600,'yyyyMMdd') --返回结果 20200529
select from_unixtime(1590729143,'yyyy-MM-dd HH:mm:ss') --返回结果 2020-05-29 13:12:23
select from_unixtime(1590729143) --返回结果 --2020-05-29 13:12:23 不加默认 yyyy-MM-dd HH:mm:ss 格式
select from_unixtime(unix_timestamp('2020-05-29','yyyy-MM-dd'),'Y年') --返回结果 2020年
select from_unixtime(unix_timestamp('2020-05-29','yyyy-MM-dd'),'yyyy-MM') --返回结果 2020-05
select from_unixtime(unix_timestamp('20200529','yyyyMMdd'),'yyyy-MM-dd') --返回结果 2020-05-29
select from_unixtime(unix_timestamp('2020-05-29','yyyy-MM-dd'),'EEEE') --返回结果 Friday
select from_unixtime(unix_timestamp('2020-05-29','yyyy-MM-dd'),'w') --返回第几周(22)
select from_unixtime(unix_timestamp('2020-05-29','yyyy-MM-dd'),'u') -- 返回本周的第几天
select from_unixtime(unix_timestamp('2020-05-29','yyyy-MM-dd'),'D') -- 本年的第几天(150)
select from_unixtime(unix_timestamp('2020-05-29','yyyy-MM-dd'),'d') -- 本月的第几天(29)
4、对日期进行格式化转换
select date_format('2020-05-29','yyyyMMdd') --返回结果 20200529
5、计算得出星期几,date_code是日期参数
select pmod(datediff(date_code, '2012-01-01'), 7) = 0 --当等于0时,这天是'星期日'
select pmod(datediff(date_code, '2012-01-01'), 7) = 1 --当等于1时,这天是'星期一'
select pmod(datediff(date_code, '2012-01-01'), 7) = 2 --当等于2时,这天是'星期二'
select pmod(datediff(date_code, '2012-01-01'), 7) = 3 --当等于3时,这天是'星期三'
select pmod(datediff(date_code, '2012-01-01'), 7) = 4 --当等于4时,这天是'星期四'
select pmod(datediff(date_code, '2012-01-01'), 7) = 5 --当等于5时,这天是'星期五'
select pmod(datediff(date_code, '2012-01-01'), 7) = 6 --当等于6时,这天是'星期六'
6、返回日期时间字段中的日期部分
select to_date('2020-05-29 13:12:23) -- 返回结果 2020-05-29
7、日期相减函数
datediff('2016-12-30','2016-12-29') --1
datediff(now(),from_unixtime(unix_timestamp('20230501','yyyyMMdd')) ) --3
date_sub('2016-12-29',10) -- 2016-12-19
二、null值处理
nvl(a,0)函数: 如果为空,值为0;如果不为空,值为a
三、数组
select array("a", "b", "c" ) --生成数组
select array(ename, job) from emp --生成数组
split(category, ",") --切分字符串生成数组
select collect_set(ename) from emp group by deptno; --行转列
select collect_list(ename) from emp group by deptno; --行转列
select map("a",12,"b,3") --创建一个map
map_keys(): --遍历key
map_values(): --遍历valus
四、字符串拼接
concat("a"+"-"+"b") : a-b
concat_ws("-", collect_list(ename)) : --第一个参数为拼接符,第二个参数为字符串 a-b
五、类型转换
cast ("100" as int) --字符串转为int
六、判断
case when判断
case
when 判断条件 then 值
when 判断条件 then 值
else 值
as aaa
if 判断
sum(if(gender="男", 1, 0)) as sex;
七、最大值
greatest() --求最大值
八、行转列,列转行
行转列: 将多行数据集成到1行中
collect_list() --可重复
collect_set() --不可重复
列传行: 将1行中数据拆成多行
explode() --将数据炸开
lateral view -- 特殊的join
例如:
select
name,
cate
from
tb_move2
lateral view explode(category) tmp as cate
九、窗口函数
.
1、 函数名(列) over (选项) :开窗口函数,控制聚合范围
例如:
sum(cost) over(partition by name)
+----------------+---------------------+----------------+---------------+
| tb_order.name | tb_order.orderdate | tb_order.cost | sum_window_0 |
+----------------+---------------------+----------------+---------------+
| jack | 2017-01-05 | 46.0 | 176.0 |
| jack | 2017-01-08 | 55.0 | 176.0 |
| jack | 2017-01-01 | 10.0 | 176.0 |
| jack | 2017-04-06 | 42.0 | 176.0 |
| jack | 2017-02-03 | 23.0 | 176.0 |
| mart | 2017-04-13 | 94.0 | 299.0 |
| mart | 2017-04-11 | 75.0 | 299.0 |
| mart | 2017-04-09 | 68.0 | 299.0 |
| mart | 2017-04-08 | 62.0 | 299.0 |
| neil | 2017-05-10 | 12.0 | 92.0 |
| neil | 2017-06-12 | 80.0 | 92.0 |
| tony | 2017-01-04 | 29.0 | 94.0 |
| tony | 2017-01-02 | 15.0 | 94.0 |
| tony | 2017-01-07 | 50.0 | 94.0 |
+----------------+---------------------+----------------+-------------
2、rows between 1 preceding and current row :最近两行
例如:
partition by name order by orderdate rows between 1 preceding and current row
| tb_order.name | tb_order.orderdate | tb_order.cost | sum_window_0 |
+----------------+---------------------+----------------+---------------+
| jack | 2017-01-01 | 10.0 | 10.0 |
| jack | 2017-01-05 | 46.0 | 56.0 |
| jack | 2017-01-08 | 55.0 | 101.0 |
| jack | 2017-02-03 | 23.0 | 78.0 |
| jack | 2017-04-06 | 42.0 | 65.0 |
| mart | 2017-04-08 | 62.0 | 62.0 |
| mart | 2017-04-09 | 68.0 | 130.0 |
| mart | 2017-04-11 | 75.0 | 143.0 |
| mart | 2017-04-13 | 94.0 | 169.0 |
| neil | 2017-05-10 | 12.0 | 12.0 |
| neil | 2017-06-12 | 80.0 | 92.0 |
| tony | 2017-01-02 | 15.0 | 15.0 |
| tony | 2017-01-04 | 29.0 | 44.0 |
| tony | 2017-01-07 | 50.0 | 79.0
3、 rows between unbounded preceding and current row :当前行和累计行
例如:
sum(cost) over(partition by name order by orderdate rows between unbounded preceding and current row)
等同于:sum(cost) over(partition by name order by orderdate)
+----------------+---------------------+----------------+---------------+
| tb_order.name | tb_order.orderdate | tb_order.cost | sum_window_0 |
+----------------+---------------------+----------------+---------------+
| jack | 2017-01-01 | 10.0 | 10.0 |
| jack | 2017-01-05 | 46.0 | 56.0 |
| jack | 2017-01-08 | 55.0 | 111.0 |
| jack | 2017-02-03 | 23.0 | 134.0 |
| jack | 2017-04-06 | 42.0 | 176.0 |
| mart | 2017-04-08 | 62.0 | 62.0 |
| mart | 2017-04-09 | 68.0 | 130.0 |
| mart | 2017-04-11 | 75.0 | 205.0 |
| mart | 2017-04-13 | 94.0 | 299.0 |
| neil | 2017-05-10 | 12.0 | 12.0 |
| neil | 2017-06-12 | 80.0 | 92.0 |
| tony | 2017-01-02 | 15.0 | 15.0 |
| tony | 2017-01-04 | 29.0 | 44.0 |
| tony | 2017-01-07 | 50.0 | 94.0
4、rows between 1 preceding and 1 following :当前行,上一行,下一行
例如:
sum(cost) over(partition by name order by orderdate rows between 1 preceding and 1 following )
+----------------+---------------------+----------------+---------------+
| tb_order.name | tb_order.orderdate | tb_order.cost | sum_window_0 |
+----------------+---------------------+----------------+---------------+
| jack | 2017-01-01 | 10.0 | 56.0 |
| jack | 2017-01-05 | 46.0 | 111.0 |
| jack | 2017-01-08 | 55.0 | 124.0 |
| jack | 2017-02-03 | 23.0 | 120.0 |
| jack | 2017-04-06 | 42.0 | 65.0 |
| mart | 2017-04-08 | 62.0 | 130.0 |
| mart | 2017-04-09 | 68.0 | 205.0 |
| mart | 2017-04-11 | 75.0 | 237.0 |
| mart | 2017-04-13 | 94.0 | 169.0 |
| neil | 2017-05-10 | 12.0 | 92.0 |
| neil | 2017-06-12 | 80.0 | 92.0 |
| tony | 2017-01-02 | 15.0 | 44.0 |
| tony | 2017-01-04 | 29.0 | 94.0 |
| tony | 2017-01-07 | 50.0 | 79.0
5、lag(col,n,default) :用于统计窗口内往上第n行值
例如:
lag(orderdate ,1,'第一次购买') over(partition by name order by orderdate)
6、ntile( ) : 将数据分成几份
例如:
select
*
from
(select
* ,
ntile(5) over(order by orderdate) as f
from
tb_order) t
where f = 1
十、编号函数
1、rank() 排序相同时会重复,总数不会变
例如:
rank() over(partition by subject order by score desc
+--------------+-----------------+---------------+----------------+
| tb_sub.name | tb_sub.subject | tb_sub.score | rank_window_0 |
+--------------+-----------------+---------------+----------------+
| 孙悟空 | 数学 | 95.0 | 1 |
| 宋宋 | 数学 | 86.0 | 2 |
| 婷婷 | 数学 | 85.0 | 3 |
| 娜娜 | 数学 | 56.0 | 4 |
| 宋宋 | 英语 | 84.0 | 1 |
| 娜娜 | 英语 | 84.0 | 1 |
| 婷婷 | 英语 | 78.0 | 3 |
| 孙悟空 | 英语 | 68.0 | 4 |
| 娜娜 | 语文 | 94.0 | 1 |
| 孙悟空 | 语文 | 87.0 | 2 |
| 婷婷 | 语文 | 65.0 | 3 |
| 宋宋 | 语文 | 64.0 | 4
2、dense_rank() 排序相同时会重复,总数会减少
例如:
dense_rank() over(partition by subject order by score desc)
+--------------+-----------------+---------------+----------------------+
| tb_sub.name | tb_sub.subject | tb_sub.score | dense_rank_window_0 |
+--------------+-----------------+---------------+----------------------+
| 孙悟空 | 数学 | 95.0 | 1 |
| 宋宋 | 数学 | 86.0 | 2 |
| 婷婷 | 数学 | 85.0 | 3 |
| 娜娜 | 数学 | 56.0 | 4 |
| 宋宋 | 英语 | 84.0 | 1 |
| 娜娜 | 英语 | 84.0 | 1 |
| 婷婷 | 英语 | 78.0 | 2 |
| 孙悟空 | 英语 | 68.0 | 3 |
| 娜娜 | 语文 | 94.0 | 1 |
| 孙悟空 | 语文 | 87.0 | 2 |
| 婷婷 | 语文 | 65.0 | 3 |
| 宋宋 | 语文 | 64.0 | 4
3、row_number() 会根据顺序计算
例如:
row_number() over(partition by subject order by score desc)
+--------------+-----------------+---------------+----------------------+
| tb_sub.name | tb_sub.subject | tb_sub.score | row_number_window_0 |
+--------------+-----------------+---------------+----------------------+
| 孙悟空 | 数学 | 95.0 | 1 |
| 宋宋 | 数学 | 86.0 | 2 |
| 婷婷 | 数学 | 85.0 | 3 |
| 娜娜 | 数学 | 56.0 | 4 |
| 宋宋 | 英语 | 84.0 | 1 |
| 娜娜 | 英语 | 84.0 | 2 |
| 婷婷 | 英语 | 78.0 | 3 |
| 孙悟空 | 英语 | 68.0 | 4 |
| 娜娜 | 语文 | 94.0 | 1 |
| 孙悟空 | 语文 | 87.0 | 2 |
| 婷婷 | 语文 | 65.0 | 3 |
| 宋宋 | 语文 | 64.0 | 4
十一、字符串正则表达式解析函数
语法:regexp_extract(string subject, string pattern, int index)
说明: 将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。
第一参数: 要处理的字段
第二参数: 需要匹配的正则表达式
第三个参数:
0 是显示与之匹配的整个字符串
1 是显示第一个括号里面的
2 是显示第二个括号里面的字段...
十二、自定义函数
1、UDF(一进一出)
2、UDAF(多进一出,类似于count、max、min)
3、UDTF(一进多出,类似于explore、split)
备注: 也可以使用reflect实现自定义函数功能
1 编写任意的类 任意的方法
2 打包
3 上传到linux
4 add jar demo2.jar
5 调用 select reflect("类名" , "方法名" , "参数") ;