HIVE SQL高频相似函数

一、排序函数

数据分析中,排序的需求场景基础且常见,如计算消费金额TOP100的客户等,为此首先介绍基于效率优化和场景应用不同的三种排序函数。

Order by

order by语句用于对查询结果集执行全局排序,所有数据集中在一个reduce中进行处理,默认按照升序排序(ASC),可以使用关键字DESC进行降序排序;

在hive中使用order by的时候会受到mapred.mode属性的约束,默认为nonstrict模式;如果在strict模式下使用order by,必须使用limit关键字,因为执行order by的时候只能启动单个reduce,如果排序的结果集过大,那么执行时间会非常漫长从而引起报错。

语法:

select *

from order_tb

order by amt desc

-- limit 10


sort by

sort by在每个reduce中对数据进行内部排序,属于局部排序。可以通过设置属性mapred.reduce.tasks指定执行的reduce个数,对输出的数据再执行归并排序得到全部结果,如果设置的reduce个数为1的话,那么sort

by 语句和order by语句输出结果一致。

语法:

select *

from order_tb

sort by amt


distribute by

distribute by会根据指定字段的值,将记录分发到不同的reduce中,但是每个reduce中的数据并不是有序的。默认对指定列取hash值,然后hash值对reduce的个数取模,模数相同的记录进入同一个reduce中。通常,将distribute by和sort by连用,针对数据进行指定划分排序。

语法:

select *

from order_tb

distribute by year

sort by amt


二、窗口排序函数

互联网面试中,经常会向面试者提出计算客户连续登录天数之类的问题,这时就需要灵活应用窗口函数,以下三种窗口排序函数也是必知基础。

Row_number()

rank()

Dense_rank()

语法:Row_number()/rank()/Dense_rank()  OVER ( PARTITION BY COL1  ORDER BY COL2 )

三个函数语法和功能一致,都需要和over()一起使用,函数将首先根据PARTITION BY后面的字段进行分组,在分组内部根据ORDER BY后面的字段进行排序,最终输出每组内部排序后的顺序编号,其中order by必须存在,PARTITION BY可以不设置。三者的不同体现在计算结果:

Row_number() :为不重复连续排序,即1、2、3、4、…

rank():为可重复跳跃排序,即1、2、2、4、…

Dense_rank() :为可重复连续排序,即1、2、2、3、…

三、类型转换函数

当把时间作为分区字段,通常会用字符串'20201202'记录时间,再进行日期运算的时候就需要进行类型转换,介绍两种将字符串转换为日期的函数:

cast(expr AS type)

将表达式expr转换为指定type类型,是一种较为常见的类型转换函数,如:cast('0123' as int) ;

需要注意的是,当使用cast将字符串转换为日期格式,字符串必须满足yyyy-MM-dd格式,需严格使用如下格式才能实现日期转换:Cast('2020-12-02'

as date) :输出:2020-12-02

to_date(date_str, format)

将字符串格式的date_str转换为指定的日期格式,也可以使用此日期专用函数实现类型转换,即:to_date('20201202','yyyyMMdd'):输出:2020-12-02

四、条件选择函数

数据处理阶段,经常需要对缺失值进行处理,尤其是表join时需注意空缺值的出现。以下2个函数简洁方便:

ifnull(expr1, expr2)

如果表达式expr1为Null,返回expr2,否则返回expr1。特别适合用于空缺值的填充,如:ifnull(amt , 0) ;

if(expr1, expr2, expr3)

如果表达式expr1成立,返回expr2,否则返回expr3。特别适合空缺值处理与逻辑判断,如:if(id is not null, 1,0) ;

五、聚合计数函数

搭建完底层宽表,针对各种维度进行汇总分析,有时会用到聚合函数:count(),返回一组值的计数值。通常有三种不同的统计方式:

count(*):统计所有行数,不会忽略为null的值;

count(1):用1代表代码行进行统计,等同于统计所有行数;

count(col):统计指定列的行数,忽略值为null的行;

简而言之,count(*)与count(1)执行结果相同,效率有所差异;count(col)与其结果不同;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 一、Aggregate--聚合类 1、avg(col)--返回某一列的平均值 2、count([DISTINCT]...
    任嘉平生愿阅读 3,332评论 0 1
  • MySQL的函数 在MySQL中,为了提高代码重用性和隐藏实现细节,MySQL提供了很多函数。函数可以理解为别人封...
    AdRainty阅读 229评论 0 2
  • (1)Oracle正则匹配使用 PS:这条SQL可以通过正则匹对查询一下,表A的字段a是否有非数字的数据,有时候数...
    vpike阅读 404评论 0 0
  • Oracle SQL基本操作 Oracle数据库基本操作 1.概述 Oracle数据库客户端一般需要安装在服务器上...
    横竖撇捺啊阅读 525评论 0 1
  • 数字函数 1. 转换 绝对值:ABS(number) 舍入微更大的最近整数值:CEILING (number) 更...
    MonsFinn阅读 434评论 0 0