hive 日期函数_数据分析面试必备——SQL窗口函数你会了吗?
之前写过一篇sql的文章,面向基础的sql操作(无眠:数据分析面试必备——SQL你准备好了吗?),目前已经有12000+收藏(收藏是点赞的5倍,你们可真狠心哪),也可以看出众多同学对sql学习的热情。但是这篇文章的评论区也有很多声音说,想看sql的进阶知识(例如:窗口函数)担心只掌握基本的sql查询不能cover到工作的方方面面。所以我又来啦!
上篇sql基础主要讲了以下内容:
本次sql主要会讲以下这四类常用函数:
这些函数可以帮助我们将复杂的查询简单化,我有遇到小伙伴对排序很迷茫,或者是错位取数不知道怎么取。这些原因都是因为你不清楚hive里面有内嵌的函数可以直接使用,当你清楚的知道了函数都分别可以帮助你做到怎样的事情,hive sql写起来就会轻松很多了。
读完本文,你会知道:
(1)hive sql进行查询过程中90%你觉得棘手的问题其实可以通过函数解决;
(2)如果你想学习hive sql里使用的函数,你应该学习哪些?
(3)这些函数分别可以怎样帮助我?具体怎么写呢?
OK,接下来让我们进入正题。(注:本文所有示例结果都经本人实际操作使用hive运行得出)
一、查询分析的利器——窗口函数
开篇就得讲窗口函数,因为窗口函数有个很明显的特点:不知道它的时候,完全不知道怎么写sql取到自己想要的数;知道了以后,就恍然大悟:“原来可以这么写啊!”所以我给它起名叫,查询分析的利器。
1. 窗口排序
row_number/rank/dense_rank
窗口函数当然是这篇文章的重点了。窗口函数中,排序函数又是最常用到的。
窗口排序主要是指非全局排序,需要在某个维度下进行排序。进入这part之前,先建个临时表来帮助理解。例如说现在想看各个department内部cost最多的人,这时候不能全局order by了,该怎么取?
select
row_number() 则在排序相同时不重复,会根据顺序排序。
rank()排序相同时会重复,总数不会变 ,意思是会出现1、1、3这样的排序结果;
dense_rank() 排序相同时会重复,总数会减少,意思是会出现1、1、2这样的排序结果。
2. 分区最大/最小值
first_value/last_value取的是分组内排序后,截止到当前行第一个/最后一个值
select
最后就会得到每个组里的cost最多和最少的人:
3. 累积百分比
cume_dist / sum() over
累积百分比的应用场景也很多,比如说,想看前XX%的用户贡献了XX%的总额。
这个地方需要两个函数的使用,1是XX%的用户,2是XX%的总额。
select
cume_dist返回的是小于等于当前值的行数/分组内总行数,但我倒序排的话,也就是大于等于了。sum()over是算的累积值的占比。
但A组这种无重复值的,结果是很好理解的。最后可以得到A部门的cost由高到低排序,XX%的人累积贡献了XX%多少。
PS. 不过我用sum()over的时候发现一个小问题,就是如果cost有两个相同的值,会出现他们的cume_dist返回值和sum()over返回值是一样的,并没有累积去算,比如说B组cost为100的两个人,他们是并列倒数第一,这个时候,cume_dist和sum over都返回的是1,这个部分我目前还没有特别明白这种情况怎么处理。继续查阅再看。
4. 错位
lead/lag函数
lead和lag函数,这两个函数一般用于计算差值,最适用的场景是计算花费时间。举个例子,有数据是每个用户浏览网页的时间记录,将记录的时间错位之后,进行两列相减就可以得到每个用户浏览每个网页实际花费的时间。
lead是用于统计窗口内往下第n行值,lag是用于统计窗口内往上第n行值。
虽然目前我们这个数据不是时间数据,也可以使用这个函数操作一下。例如说,现在计算按cost排序后,每个department的人他们的花费,以及和比他们花费排名更高一名的人的值,可以计算差值。
select
二、必须掌握的日期函数
日期函数,主要是靠表示日期类型的花样繁多来让我们觉得复杂。个人觉得我们不需要记住太多细碎的日期函数,因为当我们取数据表中的数据时,一般都是存好了的日期或时间戳,我们只需要记得:几种常见的日期格式中,怎么转换、怎么加减,得到我们需要的日期。
1. 日期(2020-03-21 17:13:39)和unix时间戳(1584782175)之间怎么相互转换
当你存储的是日期,希望转化为UNIX时间戳时,使用unix_timestamp函数,命令格式:unix_timestamp(string date, string pattern) ,表示转换pattern格式的日期到时间戳
当你存储的是时间戳,希望转化为日期,使用from_unixtime函数,命令格式:from_unixtime(bigint unixtime, [string format])
##
需要注意的是:
unix_timestamp(string date)默认转换格式为"yyyy-MM-dd HH:mm:ss"的日期;如果格式不对,例如说你直接用unix_timestamp('20200321')会得到NULL的~~
如果自己有特定希望转换的日期格式,需要使用unix_timestamp(string date, string pattern)转换pattern格式的日期。比如说,unix_timestamp('20200321','yyyyMMdd') 就可以得到 1584720000了~
2. 日期(2020-03-21 17:13:39)怎么转换为想要的格式(2020-03-21)
可以直接使用to_date函数,也可以使用字符串提取函数。
select
3. 日期之间怎么进行加减操作?
使用datesub/date_add/datediff函数
##
需要注意的是,datediff函数只能处理'yyyy-MM-dd'这种格式的日期,如果日期形式是'yyyyMMdd'的话,需要用上面提到的日期和日期格式之间的转换方法来做处理~
三、最常碰见的字符串函数
1. 字符串的提取
使用substr/substring函数
##
2. 字符串的拼接
使用concat/concat_ws函数
##
3. 字符串的常见处理函数:length/trim/lower/upper
##
4. 不同格式数据的转换:cast
##
5. 偶尔也需要用到正则表达式
regexp_extract 提取 / regexp_replace 替换
##
6.字符串解析
get_json_object
##
四、其他常用函数
1. 行列转换
lateral view explode
比如说,当遇到一个用户在很多个实验组,每个user_id对应的ab_version字段存储是这样的:
这个时候,你希望找到某个abversion的user_id,就需要把一行转换为很多行,每行后面都带有某个实验组的标志。
select
2. 随机抽样
rand(),rand(int seed)
从数据中随机抽取一些样本,使用rand函数,会返回一个0到1范围内的随机数。如果指定种子seed,则会等到一个稳定的随机数序列
##
至此,基本常用到的函数就介绍完毕了。
不同于上篇基础的SQL入门,写这篇文章的原因是希望大家能对SQL内置的函数有个概念,知道当自己遇到什么样的查询问题时,可以选择进行检索查询是否有对应解决的函数,而不是使用特别笨拙的方法去进行取数。
希望大家看完有收获,点赞是对创作者最大的鼓励~(一本正经的鞠躬
关注就更好了,可以持续看更新~
参考:
Hive 分析函数lead、lag实例应用
hive 日期函数_数据分析面试必备——SQL窗口函数你会了吗?相关推荐
- server sql 分组 去重 字符串拼接_SQL | 数据分析面试必备SQL语句+语法
| 作者:无眠 | 来源:知乎 前些天在网上冲浪的时候看到一个案例咨询,问说世界500强的数据分析要不要去,评论区一片爆炸:"楼主能分享一下文科生怎么转行做数据分析吗??".&qu ...
- SQL | 数据分析面试必备SQL语句+语法
关注上方"小詹学Python",选择"星标公众号", 关键时间,第一时间送达! | 作者:无眠 | 来源:知乎 前些天在网上冲浪的时候看到一个案例咨询,问说世界 ...
- hive substr函数_数据分析工具篇——HQL函数及逻辑
本篇文章我们梳理一下hive常用的函数,对于hive而言,常用的函数并不是特别多,往往记住关键几个,就可以解决80%的问题,这也是大家喜欢hive的原因,那么,常用的函数有哪些呢? 时间函数 1)时间 ...
- 【hive 日期函数】Hive常用日期函数整理
1.to_date:日期时间转日期函数 select to_date('2015-04-02 13:34:12'); 输出:2015-04-02 1 2 2.from_unixtime:转化unix时 ...
- 【hive 日期函数 大全】Hive常用日期函数整理 史上最全
[hive 日期函数 大全]Hive常用日期函数整理注意:1) hive 没有 to_char函数 2) HIVE 日期函数只识别 年-月-日 不能识别 年-月 ,所以处理月份的时候需要特殊处理1)h ...
- hive日期函数总结
Hive 日期函数 Hive Date Functions 官网地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+U ...
- Hive日期函数使用
Hive日期函数使用 year month day hour minute second add_months date_add date_sub date_format datediff dayof ...
- hive日期函数使用大全
以下hive日期函数百分百满足日常工作使用,请仔细阅读!! [hive 日期函数 大全]Hive常用日期函数整理注意:1) hive 没有 to_char函数 2) HIVE 日期函数只识别 年-月- ...
- hive sql练习_SQL语句+语法 I 数据分析面试必备
- 点击上方"中国统计网"订阅我吧!- 前些天在网上冲浪的时候看到一个案例咨询,问说世界500强的数据分析要不要去,评论区一片爆炸:"楼主能分享一下文科生怎么转行做数据分 ...
最新文章
- dmalloc 原文 翻译整理
- php怎么获取手机屏,使用PHP获得屏幕分辨率
- 数据结构-双向链表的实现
- Go语言 goroutine
- s5pv210 linux内核移植,简单根文件系统制作 - S5PV210 Linux3.8.3内核移植_Linux编程_Linux公社-Linux系统门户网站...
- VC++ 中ListCtrl经验总结
- jQuery的get()和post()方法
- C++:常用数据类型及常见操作
- Crontab 使用(转)
- Cisco无线AP的配置
- ARM汇编指令(ARM寻址方式、汇编指令、伪指令
- 【报告分享】2022全面数字化发展下的消费市场洞察.pdf(附下载链接)
- python 一个简单的天气预报程序
- 【Android 界面效果13】关于全屏和取消标题栏
- XLua访问C#中的List或者数组
- 如何使用“启动转换”从 Mac 上移除 Windows?
- LINUX下载编译sqlite-jdbc的jar包
- kb2919355无法安装
- pdf转word好用的软件
- c语言向量乘法,运用C语言实现向量积
热门文章
- python 中 enumerate() 函数使用
- opencv学习第6课官方练习实现 Create a Paint application with adjustable colors and brush radius using trackbars
- Python实现对于文件的分类
- Python:Numpy库中的invert()函数的用法
- redmine 自己定义字段mysql表结构
- 痴情研究java内存中的对象
- sql 的 DATE_FORMATE()函数
- 基于Altium Designer的4层PCB板的绘制
- [转载] C++11初始化列表与参数列表的作用
- Python练习之购物车