内容目录

  • 常用的内置函数
    • ①空字段赋值:NVL
    • ②CASE WHEN THEN ELSE END
    • ③行转列
    • ④列转行
    • ⑤窗口函数
    • ⑥Rank

常用的内置函数

①空字段赋值:NVL

NVL:给值为NULL的数据赋值,它的格式是NVL( value,default_value)。

功能:如果value为NULL,则NVL函数返回default_value的值,否则返回value的值

如果两个参数都为NULL ,则返回NULL。

用法1:赋予一个常量

比如在员工表中就有很多空值,现在将奖金为空的员工赋值为0

select ename, sal, nvl(comm, 0) from emp;

nvl(comm, 0):当comm为null时,用0代替

用法2:赋予一个变量

当员工奖金为null时,用mgr代替

select ename, sal, nvl(comm, mgr) from emp;

②CASE WHEN THEN ELSE END

用法:

CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END
---> When a = b, returns c; when a = d, return e; else return f

当a=b,返回c;当a=d,返回e;否则返回f;

③行转列

1)CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;

Example:>>> SELECT concat('abc', 'def') FROM src LIMIT 1;>>> 'abcdef'

将前后两个字符串连接起来

2)CONCAT_WS(separator, str1, str2,…):

Example:
>>> SELECT concat_ws('.', 'www', array('facebook', 'com')) FROM src LIMIT 1;
>>> 'www.facebook.com'

根据某个指定字符连接起来,支持连接array和字符串

3)COLLECT_SET(col):

它的主要作用是将某字段的值进行去重汇总,产生array类型字段。

4)示例:

需要达成的效果把星座和血型一样的人归类到一起。结果如下:

射手座,A            猪八戒|小白龙
白羊座,A            孙悟空|唐僧
白羊座,B            黑熊怪|沙和尚

(1)准备数据

vim /opt/module/hive/datas/concat.txt
孙悟空,白羊座,A
猪八戒,射手座,A
沙和尚,白羊座,B
唐僧,白羊座,A
小白龙,射手座,A
黑熊怪,白羊座,B

(2)创建person_info表并导入数据

create table person_info(
name string,
constellation string,
blood_type string
)
row format delimited
fields terminated by ",";

导入数据

load data local inpath '/opt/module/hive/datas/concat.txt' into table person_info;

(3)按照要求查询数据

SELECTNAME,CONCAT_WS(',',constellation,blood_type) c_b
FROM person_info;

select t.c_b,concat_ws('|', collect_set(t.name))
from(SELECTNAME,CONCAT_WS(',',constellation,blood_type) c_bFROM person_info) t
group by t.c_b;

除了上述的写法,还可以在一个selct语句中实现

SELECT
concat_ws('|',COllect_set(concat_ws(',',constellation,blood_type))),
concat_ws('|',collect_set(name))
FROM person_info
group by constellation,blood_type;

④列转行

1)EXPLODE(col):

将hive一列中复杂的array或者map结构拆分成多行

2)SPLIT(string str, string regex):

按照regex字符串分割str,会返回分割后的字符串数组

3)LATERAL VIEW

用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias

用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,再将多行结果组合成一个支持别名的虚拟表

4)示例

需求:将电影分类中的categroy列的数据分开

  movie          category
《疑犯追踪》   悬疑,动作,科幻,剧情
《Lie to me》 悬疑,警匪,动作,心理,剧情
《战狼2》     战争,动作,灾难↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓《疑犯追踪》      悬疑
《疑犯追踪》      动作
《疑犯追踪》      科幻
《疑犯追踪》      剧情
《Lie to me》   悬疑
《Lie to me》   警匪
《Lie to me》   动作
《Lie to me》   心理
《Lie to me》   剧情
《战狼2》        战争
《战狼2》        动作
《战狼2》        灾难

(1)数据准备

vim /opt/module/hive/datas/movie_info.txt

《疑犯追踪》   悬疑,动作,科幻,剧情
《Lie to me》 悬疑,警匪,动作,心理,剧情
《战狼2》   战争,动作,灾难

(2)创建hive表并导入数据

create table if not exists movie_info(movie string,category string
)
row format delimited
fields terminated by '\t';

(3)导入数据

load data local inpath '/opt/module/hive/datas/movie_info.txt' into table test.movie_info;

(4)按需求查询数据

select movie, category_name
from movie_info
lateral view
explode(split(category, ',')) movie_temp
as category_name;

⑤窗口函数

1)相关函数说明

函数名 描述 用法
over() 指定分析函数工作的数据窗口大小,
这个数据窗口的大小可能会随着行的改变而改变
Current row: 当前行 n
preceding:往前n行数据 n
following:往后n行数据
unbounded preceding:表示从前面的起点
unbounded following:表示从后面的起点
over(partition by name)
over(order by orderdate)
over(rows between and )
over(rows between unbounding preceding and unbounded following )
over(partition by name order by orderdate
rows between n preceding and current)
lag(col,n,default_val) 往前第n行数据
lead(col,n,default_val) 往后第n行数据
Ntile(n) 把有序窗口的行分发到指定数据的组中,各个组的编号,编号从1开始,对于每一行,ntile返回此行所属的组的编号 注意:n必须为int类型

注意:

当有Order by ,没有WINDOW时, WINDOW的范围是,unbounded preceding and current row

select count(*) over(order by orderdate) from business where month(orderdate)=4;

当Order by和 WINDOW都没有时, WINDOW的范围是,unbounded preceding and unbounded following

select count(*) over() from business where month(orderdate)=4;

2)示例

(1)数据准备

vim /opt/module/hive/datas/business.txt
jack,2017-01-01,10
tony,2017-01-02,15
jack,2017-02-03,23
tony,2017-01-04,29
jack,2017-01-05,46
jack,2017-04-06,42
tony,2017-01-07,50
jack,2017-01-08,55
mart,2017-04-08,62
mart,2017-04-09,68
neil,2017-05-10,12
mart,2017-04-11,75
neil,2017-06-12,80
mart,2017-04-13,94

(2)创建hive表

create table if not exists business(name string,orderdate string,cost int
)
row format delimited
fields terminated by ',';

(3)导入数据

load data local inpath '/opt/module/hive/datas/business.txt' into table test.business;

(4)需求

  1. 查询在2017年4月份购买过的顾客及总人数
  2. 查询顾客的购买明细及月购买总额
  3. 上述的场景, 将每个顾客的cost按照日期进行累加
  4. 查询每个顾客上次的购买时间
  5. 查询前20%时间的订单信息

(5)需求实现

1、查询在2017年4月份购买过的顾客及总人数

首先,如何查询出4月份购买过的顾客名单

select name from businee where month(orderdata)=4;

然后求出购买的总人数

select count(*) from business where month(orderdate)=4;

需要把所有的名字后面都添加一个总人数,使用窗口函数

select count(*) over() from business where month(orderdate)=4;

这种求得的总人数会把重复的也计算上去,所以分组求解

select count(*) over() from business where month(orderdate)=4;

将其组合在一起

select name, count(*) over() from business where month(orderdate)=4 group by name;

注意:如果日期并不是规则的格式,就不可以使用month进行月份判断,就可以使用分割字符substring进行处理

select name, count(*) over() from business where substring(orderdate, 1, 7)='2017-04' group by name;

2、查询顾客的购买明细及月购买总额

首先,如何查询顾客的购买明细

select name, count from business;

然后查询出月购买金额

select name, orderdate, cost, sum(cost) over(partition by name,month(orderdate)) from business;

3、将每个顾客的cost按照日期进行累加

将所有行进行累加

select name, orderdate, cost, sum(cost) over(partition by name order by month(orderdate)) from business;

将本行和前所有行进行累加

select name, cost, sum(cost)
over(partition by name order by month(orderdate) rows between unbounded preceding and current row)
from business;

将本行只与前一行进行聚合

select name, cost, sum(cost)
over(partition by nameorder by month(orderdate)rows between 1 preceding and 1 following
)
from business;

将本行与后面所有行进行聚合

select name, cost, sum(cost)
over(partition by nameorder by month(orderdate)rows between current row and unbounded following
)
from business;

按照名字和月份分组,组内递增

select name, orderdate, cost, sum(cost)
over(partition by name, month(orderdate)order by day(orderdate)rows between unbounded preceding and current row
)
from business;

(4)查看顾客上次的购买时间

lag(col, n, default_val):往前n行的数据col

select name,orderdate,cost, lag(orderdate,1,'1900-01-01') over(partition by name order by orderdate ) as time1,lag(orderdate,2) over (partition by name order by orderdate) as time2
from business;

(5)查询前20%时间的订单信息

ntile(n):把有序窗口的行分发到指定数据的组中,各个组的编号,编号从1开始,对于每一行,ntile返回此行所属的组的编号

将数据按指定顺序分为n组

select * from (select name,orderdate,cost, ntile(5) over(order by orderdate) sorted from business
) t
where sorted = 1;

order by还可以指定正序或降序

select * from (select name,orderdate,cost, ntile(5) over(order by orderdate desc) sorted from business
) t
where sorted = 1;

⑥Rank

函数说明:

RANK() 排序相同时会重复,总数不会变

DENSE_RANK() 排序相同时会重复,总数会减少

ROW_NUMBER() 会根据顺序计算

有这么一张表的数据,按需要进行处理

1)按照学科对分数进行排序,重复时顺序相同,总数不变

select
name,
subject,
score,
rank() over(partition by subject order by score desc) sorts
from score;

2)按照学科对分数进行排序,重复时顺序相同,总数减少

select
name,
subject,
score,
dense_rank() over(partition by subject order by score desc) sorts
from score;

3)按照学科对分数进行排序,重复时顺序排列,总数不变

select
name,
subject,
score,
row_number() over(partition by subject order by score desc) sorts
from score;

11:Hive从0到1系列学习:函数之常用的内置函数相关推荐

  1. sql空字符串判断函数_access常用的内置函数

    新朋友点"Office交流网"蓝字关注我们 Access提供了几种类型的函数,可将这些函数分为以下几类: 转换:把一个值转换为另一个. 日期/时间:返回日期和/或时间值. 判断 ...

  2. python在匿名函数作和_python内置函数和匿名函数

    楔子 在讲新知识之前,我们先来复习复习函数的基础知识. 问:函数怎么调用? 函数名() 如果你们这么说...那你们就对了!好了记住这个事儿别给忘记了,咱们继续谈下一话题... 来你们在自己的环境里打印 ...

  3. Python68个内置函数大总结,内置函数的骚操作来了!!

    ​学了快一年的Python了,突然发现,内置函数能够大大的加快开发时的效率,花了一周时间整理了一下68个内置函数,来看看内置函数的骚操作吧! 由于平台原因图片不是很清晰如果想要获取高清的照片或者pdf ...

  4. [JSP][JSTL]页面调用函数--它${fn:}内置函数、是推断字符串是空的、更换车厢

    页面中调用函数--之${fn:}内置函数 函数描写叙述 fn:contains(string, substring) 假设參数string中包括參数substring,返回true fn:contai ...

  5. python常用函数-Python小白必备的8个最常用的内置函数(推荐)

    Python给我们内置了大量功能函数,官方文档上列出了69个,有些是我们是平时开发中经常遇到的,也有一些函数很少被用到,这里列举被开发者使用最频繁的8个函数以及他们的详细用法 print() prin ...

  6. python常用内置函数总结-Python学习教程之常用的内置函数大全

    前言 内置函数,一般都是因为使用比较频繁或是元操作,所以通过内置函数的形式提供出来.在Python中,python给我们提供了很多已经定义好的函数,这里列出常用的内置函数,分享出来供大家参考学习,下面 ...

  7. python 常用内置函数_Python小白必备的8个最常用的内置函数(推荐)

    Python给我们内置了大量功能函数,官方文档上列出了69个,有些是我们是平时开发中经常遇到的,也有一些函数很少被用到,这里列举被开发者使用最频繁的8个函数以及他们的详细用法 print() prin ...

  8. php内置函数和扩展,PHP 内置函数strlen 和mbstring扩展函数mb_strlen的区别

    #EXAMPLE $str_uncode = "简体中文Chinese(Simplified)"; //统计字符串长度 echo strlen($str_uncode).' ';/ ...

  9. python学习之最常用的内置函数

    python学习之最常用的内置函数 Python 内置函数总共有70余个(通常把内置类也统称为内置函数),覆盖面广,功能强大.不过,对于初学者在初级阶段,掌握下面几个函数是当务之急. (1) 控制台输 ...

  10. python必背代码-Python小白必备的8个最常用的内置函数(推荐)

    Python给我们内置了大量功能函数,官方文档上列出了69个,有些是我们是平时开发中经常遇到的,也有一些函数很少被用到,这里列举被开发者使用最频繁的8个函数以及他们的详细用法 print() prin ...

最新文章

  1. codevs1688 求逆序对(权值线段树)
  2. Sequence of component save EC and orderadm_h save
  3. css3 transform matrix 深入理解
  4. python重复输出五句话_如何用python3输出重复的数据?
  5. 通用apdu指令_8086微处理器中的通用指令格式
  6. nodepad 关闭语法检查
  7. 关于group by的用法 原理
  8. easyUI 之datagrid 在前端自定义排序
  9. linux syslog 删除文件_恢复日志文件syslog在Linux中删除的方法
  10. linux 更新目录时间戳,修改linux 文件的时间戳
  11. 对封装继承多态的理解
  12. Redis集群搭建(单设备,多设备)
  13. 关于TC Games针对没有耳机接口的Type-C用户玩手游如何传音和语音
  14. 【微信小程序/云开发bug解决方案合集】持续更新中(最新22-11-21)
  15. android华为手机全屏显示
  16. 矩阵维度:几乘几怎么看
  17. 超哥笔记--shell 基本命令(4)
  18. vue生命周期钩子函数有哪些
  19. java表白程序玫瑰花_给爱人的玫瑰花表白程序代码--Java版
  20. 错误源计算机检,Voevodsky | 单一基础的源起——为避免数学错误而发展计算机验证证明的个人使命...

热门文章

  1. 阿浪与佩奇在Java遇到的muddy puddles
  2. hdu 5285 wyh2000 and pupil 二分图染色发判定,求最大匹配
  3. 是怎么回事?沉浸式体验反倒是局限虚拟现实
  4. 花前病酒的学拳笔记,杨氏叶派,叶家拳,暂时1-19
  5. ps裁剪和裁切的区别_ps裁剪工具怎么用?调整图像与画布的尺寸(三)
  6. Excel xlsx file; not supported报错
  7. 数据恢复工具winhex教程
  8. 【转】图像视觉开源代码
  9. 电脑语言栏消失看我怎么办
  10. 2、Android底层机制