08-hive中的函数

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

upper – (转大写)

select upper(‘abc’);

length – (字符串长度,字符数)

select length(‘abc’);

concat – (字符串拼接)

select concat(‘A’,‘B’,‘C’); # ABC

concat_ws – (指定分隔符)

select concat_ws(‘-’,‘a’,‘b’,‘c’); # a-b-c

substr-- (求子串)

select substr(‘abcde’,3); # cde

select substr(‘abcde’,2,3); # bc

split(str ,regex) – 切分字符串,返回数组。

select split(“a-b-c-d-e-f”,“-”);

类型转换函数

cast(value as type) – 类型转换

select cast(“123” as int)+1;

数学函数

round – 四舍五入((42.3 ->42))

select round(42.3);

ceil – 向上取整(42.3=>43)

select ceil(42.3);

floor – 向下取整(42.3=>42)

select floor(42.3);

其他常用函数

nvl(value ,default value):如果value为null,则使用default value,否则使用本身value.

select if(1>2 ,ture,false); # 返回false

select coalesce(1,2,3,4,5) # 返回第一个不为空的 本题返回 1

select coalesce(NULL,2,3,4,5) # 本题返回 2

hive的窗口函数(重点)


窗口函数over简介

先来看一下这个需求:求每个部门的员工信息以及部门的平均工资。在mysql中如何实现呢

SELECT emp.*,avg_sal

FROM emp

J0IN (

SELECT deptno

,round(AVG(ifnull(sal, 0))) AS avg_sal

FR0M emp

GROUP BY deptno

) t

ON emp.deptno = t.deptno

ORDER BY deptno;

select emp.*,(select avg(ifnull(sal,0)) from emp B where B.deptno = A.deptno) from emp A;

通过这个需求我们可以看到,如果要查询详细记录和聚合数据,必须要经过两次查询,比较麻烦。这个时候,我们使用窗口函数,会方便很多。那么窗口函数是什么呢?

-1)窗口函数又名开窗函数。属于分析函数的一种。

-2)是一种用于解决复杂报表统计需求的函数。

-3)窗口函数常用于计算基于组的某种值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行。简单的说窗口函故对每条详细记录开一个面口,进行聚合遶计的查询

-4)开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化。

-5)窗口函数一般不单独使用

-6)窗口函数内也可以分组和排序

在这里插入图片描述

案例准备

数据准备order.txt

姓名 购买日期 购买数量

saml,2018-01-01,10

tomy,2018-01-02,15

saml,2018-02-03,23

– 1.创建order表:

create table if not exists t_order(

name string,

orderdata string,

cost int

)row format delimited fields terminated by ‘,’;

– 2.加载数据

load data local inpath “./root/order.txt” into table t_order;

需求:查询每个订单的信息,以及订单的总数

– 1.不使用窗口函数

– 查询所有明细

select * from t_order;

#查询总量

select count(*) from t_order;

– 2.使用窗口函数:通常格式为可用函数+over()函数

select , count() over() from t_order;

– 查询返回的结果

saml,2018-01-01,10 3

tomy,2018-01-02,15 3

saml,2018-02-03,23 3

注意:

窗口函数是针对每一行数据的.

如果over中没有指定参数默认窗口大小为全部结果集

需求:查询在2018年1月份购买过的顾客购买明细及总人数

select * ,count(*) over()

from t_order

where substring(orderdate,1,7) = ‘2018-01’;

– 查询返回的结果

saml,2018-01-01,10 2

tomy,2018-01-02,15 2

distribute by 子句

在over窗口中进行分组,对某一字段进行分组统计,窗口大小就是同一个组的所有记录

需求:查看顾客的购买明细及月购买总额

select name,orderdate,cost,sum(cost) over (distribute by month(orderdate))

from t_order;

saml,2018-01-01,10 33

tomy,2018-01-02,15 15

saml,2018-02-03,23 33

需求:查看顾客的购买明细及每个顾客的月购买总额

select name,orderdate,cost,sum(cost) over (distribute by name, month(orderdate))

from t_order;

saml,2018-01-01,10 33

tomy,2018-01-02,15 15

saml,2018-02-03,23 33

sort by 子句

sort by子句会让输入的数据强制排序(强调:当使用排序时,窗口会在组内逐行变大)

需求:查看顾客的购买明细及每个顾客的月购买总额,并且按照日期降序排序

select name,orderdate,cost,

sum(cost) over (distribute by name, month(orderdate)

sort by orderdata desc)

from t_order;

saml,2018-01-01,10 10

saml,2018-02-03,23 33

saml,2018-02-03,53 86

tomy,2018-01-02,15 15

hive的window子句


如果要对窗口的结果做更细粒度的划分,那么就使用window子句,常见的有下面几个

PRECEDING:往前

FOLLOWING:往后

CURRENT ROW:当前行

UNBOUNDED:起点,

UNBOUNDED PRECEDING:表示从前面的起点,

UNBOUNDED FOLLOWING:表示到后面的终点

需求:查看顾客到目前为止的购买总额

select name,

t_order.orderdata,

cost,

sum(cost) over(partition by name order by orderdata rows between UNBOUNDED PRECEDING and current row) as allCount

from t_order;

需求:求每个顾客最近三次的消费总额

select name,orderdate,cost,

sum(cost) over(partition by name order by orderdata rows between 2 PRECEDING and current row)

from t_order;

Hive的序列函数


NTILE

ntile 是Hive很强大的一个分析函数。可以看成是:它把有序的数据集合平均分配指定的数量(num)个榻中,将桶号分配给每一行。如果不能平均分配,则优先分配较小编号的桶,并且各个桶中能放的行数最多相差1。

例子:

select name,orderdate,cost,

ntile(3) over(partition by name), #按照name进行分组,在分组内将数据切成3份

from t_order;

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

hive的排名函数


在这里插入图片描述

准备数据 stu_score.txt

在这里插入图片描述

create table if not exists stu_score(

userid int,

classno string,

score int

)

row format delimited

fields terminated by ’ ';

local data inpath ‘./root/stu_score.txt’ overwrite into table stu_score;

在这里插入图片描述

hive的自定义UDF函数


介绍

在这里插入图片描述

案例

idea maven项目HiveFunction 在pom.xml加入以下maven的依赖包

org.apache.hive

hive-exec

2.1.1

写个类 ConcatString

public class ConcatString extends UDF{

public String evaluate(String str){

return str+“!”;

}

}

注意

1.继承org.apache.hadoop.hive.al.exec.UDF

2.编写evaluate(),这个方法不是由接口定义的,因为它可接受的参数的个数,数据类型都是不确定的。Hive会检查UDF ,看能否找到和函数调用相匹配的evaluate()方法

第一种:命令加载(只针对当前的session有效)

打包 双击package

HiveFunction-1.0.jar

上传上去

[root@tianqinglong01 ~]# mv HiveFunction-1.0.jar function.jar

我的面试宝典:一线互联网大厂Java核心面试题库

以下是我个人的一些做法,希望可以给各位提供一些帮助:

整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!

image

283页的Java进阶核心pdf文档

Java部分:Java基础,集合,并发,多线程,JVM,设计模式

数据结构算法:Java算法,数据结构

开源框架部分:Spring,MyBatis,MVC,netty,tomcat

分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等

微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

image

还有源码相关的阅读学习

image

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
我的面试宝典:一线互联网大厂Java核心面试题库

以下是我个人的一些做法,希望可以给各位提供一些帮助:

整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!

[外链图片转存中…(img-NfbozuhV-1714373901607)]

283页的Java进阶核心pdf文档

Java部分:Java基础,集合,并发,多线程,JVM,设计模式

数据结构算法:Java算法,数据结构

开源框架部分:Spring,MyBatis,MVC,netty,tomcat

分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等

微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

[外链图片转存中…(img-FjmAyjlE-1714373901607)]

还有源码相关的阅读学习

[外链图片转存中…(img-8NIpavcc-1714373901607)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值