百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

HIVE函数讲解之单行函数、聚合函数、炸裂函数、窗口函数

wxin55 2024-10-25 18:02 11 浏览 0 评论

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。

Hive会将常用的逻辑封装成函数给用户进行使用,类似于Java中的函数。好处在于可以避免用户反复写逻辑,可以直接拿来使用。重点在于用户需要知道函数叫什么,能做什么。

Hive函数大致分为五类:单行函数、聚合函数、炸裂函数、窗口函数、自定义函数,今天我们主要介绍一下除自定义函数外的函数部分案例使用。

自定义函数咱们之前已经细致的讲过了,可以根据连接查看:HIVE函数讲解之自定义函数

一、单行函数

单行函数的特点是一进一出,大致可以分为数学函数,日期函数,字符串函数,流程控制函数,集合函数。

1. 数学函数

数学函数针对于数值形式的计算,返回值均为数值类型。

示例:

select 1 + 1; 2

select 1 - 1; 0

select 2 * 2; 4

select 3 / 2; 1.5

select 5 % 2; 1

select 1 & 2; 0

select 1 | 2; 3

select 1 ^ 2; 3

select ~1; -2

2. 日期函数

① unix_timestamp(string time):返回值为bigint类型。

select unix_timestamp('2023-04-06 15:31:26');

1680795086

② from_unixtime(bigint time [,string format]):返回值为

string类型。

select from_unixtime(1680795086);

2023-04-06 15:31:26

③ year(string time):返回值为int类型。

select year('2023-04-06 15:31:26');

2023

④ month(string time):返回值为int类型。

select month('2023-04-06 15:31:26');

4

⑤ day(string time):返回值为int类型。

select day('2023-04-06 15:31:26');

6

⑥ datediff(string time,string time):返回值类型为int类型。

select datediff('2023-04-07','2023-04-06');

1

⑦ date_add(string date,int day):返回值为date类型。

select date_add('2023-04-06',1);

2023-04-07

⑧ date_sub(string date,int day):返回值为date类型。

select date_sub('2023-04-06',1);

2023-04-05

⑨ date_format(string date,string format):返回值为string类型。

select date_format('2023-04-06 15:45:25','yyyy-MM-dd');

2023-04-06

3. 字符串函数

① upper(string str):返回值为string类型。

select upper('abc');

ABC

② lower(string str):返回值为string类型。

select lower('ABC');

abc

③ length(string str):返回值为int类型。

select length('atguigu');

7

④ trim(string str):返回值为string类型。

select trim(' abc ');

abc

⑤ substring(string str,int start[,int end]):返回值为string类型。

select substring('atguigu',2,5);

tguig

⑥ replace(string str,string bef,string las):返回值为string类型。

select replace('atguigu','a','b');

btguigu

⑦ split(string str,string par):返回值为array类型。

select split('atguigu','g');

["at","ui","u"]

⑧concat_ws(string spl,string s1,string s2,...):返回值为string类型。

select concat_ws('-','a','b','c');

a-b-c

⑨ get_json_object(string json,string path):返回值为string类型。

select get_json_object('{"data1":1,"data2":2}','$.data2');

2

4. 流程控制函数

示例:

select case 100 when 50 then 'tom' when 100 then 'mary' else 'tim' end;

mary

select if(2>3,2,3);

3

5. 集合函数

① size(array/map m):返回值为int类型。

select size(array('a','b','c'));

3

② map_keys(map m):返回值为array类型。

select map_keys(test) from test;

[1,2,3]

test字段值为{"1":"a","2":"b","3","c"}

③ map_values(map m):返回值为array类型。

select map_values(test) from test;

["a","b","c"]

④ array_contains(array arr,string str):返回值为boolean类型。

select array_contains(array('1','2','3'),'4');

false

⑤ sort_array(array arr):返回值为array类型。

select sort_array(array(4,2,3,1));

[1,2,3,4]

二、聚合函数

聚合函数对一组数据进行计算,并返回单个值。

测试数据test表:

1. 普通聚合

示例:

select count(*) from test;

4

select sum(score) from test;

260

select max(score) from test;

80

select min(score) from test;

50

select avg(score) from test;

65

2. 高级聚合

示例:

select collect_list(name) from test;

["atguigu1","atguigu2","atguigu3","atguigu3"]

select collect_set(name) from test;

["atguigu1","atguigu2","atguigu3"]

3. 分组

Group By语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行聚合操作,同时可以使用having进行过滤。

示例:

select

id,

avg(score) avg_s

from test

group by id

having avg_s > 60;

三、炸裂函数

Hive处理的数据字段是可再分的,不满足原子性,即DDL可以定义一个字段类型为数组,因此才有了explode()函数,用于给这个字段展开降维,把指定的数组字段拆分降维展开为多行。类似于UDTF函数,作用于单/多个数据行,并且产生多个数据行,以一个表作为输出。

1. explode 将数组或者map展开

例:

select explode(array('a','b','c','d'));

结果:

a b c d

2. json_tuple 取出json字符串中的属性值

例:

select json_tuple('{"name":"王二狗","sex":"男","age":"25"}','name','sex','age');

结果:

王二狗 男 25

3. lateral view 侧写

炸裂函数和聚合函数一样不支持和普通列一起查询,所以一般会配合侧写进行查询。

用法:lateral view udtf(expression) tableAlias AS columnAlias

解释:lateral view用于和split,explode等UDTF一起使用,它能够将一行数据拆分成多行数据,在此基础上可以对拆分后的数据进行聚合。

lateral view首先为原始表的每行调用UDTF,UDTF会把每一行拆分成一行或者多行,lateral view再把结果组合,产生一个支持别名表的虚拟表。

例:

select movie, category_namefrom movie_infolateral viewexplode(split(category,",")) movie_info_tmp AS category_name;

四、窗口函数

窗口函数,也可以叫开窗函数,其从本质来看是将Hive 中一些复杂的查询封装成了窗口的形式,进行数据统计时使用并且操 作十分方便,窗口函数为统计时使用的聚合函数指定一个聚合的范围。

1. 语法

基本语法:函数 + over( [partition by ...] [order by ...] [窗口子句] )

  • over表示开窗,默认窗口大小会包含所有数据。
  • partition by表示根据字段再划分一个细窗口,相同字段进入同一个细窗口里面,每个窗口之间相互独立,窗口子句对于每个细窗口独立生效。
  • order by表示窗口内按什么排序,如果只有over表示直接最大窗口排序;如果有partition by每个细窗口单独排序。
  • 窗口子句,可以进一步限定范围

(rows | range) between (unbounded | [num]) preceding and ([num] preceding | current row | (unbounded | [num]) following

(rows | range) between current row and (current row | (unbounded | [num]) following)

(rows | range) between [num] following and (unbounded | [num]) following

示例:

rows between unbounded preceding and unbounded following

行的范围为上无边界到下无边界(第一行到最后一行)。

注:窗口函数是一行一行执行的。

2. 使用

① 窗口函数

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

lead(col,n, default_val):往后第n行数据。

first_value (col,true/false):当前窗口下的第一个值,第二个参数为true,跳过空值。

last_value (col,true/false):当前窗口下的最后一个值,第二个参数为true,跳过空值。

② 聚合函数

max:最大值。

min:最小值。

sum:求和。

avg:平均值。

count:计数。

③ 排名分析函数

rank:排名相同时会重复总数不会减少。

dense_rank:排名相同时会重复总数会减少。

row_number:行号。

ntile:分组并给上组号。

3. 注意事项

  • 窗口函数的执行次序是在group by之后。
  • 有时窗口子句加与不加结果是一致的,原因是窗口子句有默认值,当有order by 但是缺少窗口子句时,范围是上无边界到当前行,当order by和窗口子句都缺少时,范围为上无边界到下无边界。
  • 不是所有函数都需要写窗口子句,rank、dense_rank、ntile、row_number、lag、lead 这些函数不支持窗口子句。
  • 排名分析函数中不需要写参数,会将排好序数据进行标号。

4. 使用示例

例如,表table,字段为id,sub,score,需求出表每门学科的成绩排名。

select

id,

sub,

score,

rank() over(distribute by sub sort by score desc) rank

from table;

五、总结

本文给大家介绍了Hive中一些常用的基本函数、炸裂函数和窗口函数的理论及使用,各位程序猿们需要多多练习函数的使用,体会函数的效果以及它们之间的联合使用!下期为大家介绍HIVE自定义函数的方法,实现我们自己想要的效果。

相关推荐

ES6中 Promise的使用场景?(es6promise用法例子)

一、介绍Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码doSomething(f...

JavaScript 对 Promise 并发的处理方法

Promise对象代表一个未来的值,它有三种状态:pending待定,这是Promise的初始状态,它可能成功,也可能失败,前途未卜fulfilled已完成,这是一种成功的状态,此时可以获取...

Promise的九大方法(promise的实例方法)

1、promise.resolv静态方法Promise.resolve(value)可以认为是newPromise方法的语法糖,比如Promise.resolve(42)可以认为是以下代码的语...

360前端一面~面试题解析(360前端开发面试题)

1.组件库按需加载怎么做的,具体打包配了什么-按需加载实现:借助打包工具(如Webpack的require.context或ES模块动态导入),在使用组件时才引入对应的代码。例如在V...

前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?

Promise的finally方法是一个非常有用的工具,它无论Promise是成功(fulfilled)还是失败(rejected)都会执行,且不改变Promise的最终结果。它的实现原...

最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式

看了全网手写Promise的,大部分对于新手还是比较难理解的,其中几个比较难的点:状态还未改变时通过发布订阅模式去收集事件实例化的时候通过调用构造函数里传出来的方法去修改类里面的状态,这个叫Re...

前端分享-Promise可以中途取消啦(promise可以取消吗)

传统Promise就像一台需要手动组装的设备,每次使用都要重新接线。而Promise.withResolvers的出现,相当于给开发者发了一个智能遥控器,可以随时随地控制异步操作。它解决了三大...

手写 Promise(手写输入法 中文)

前言都2020年了,Promise大家肯定都在用了,但是估计很多人对其原理还是一知半解,今天就让我们一起实现一个符合PromiseA+规范的Promise。附PromiseA+规范地址...

什么是 Promise.allSettled()!新手老手都要会?

Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的pr...

前端面试-关于Promise解析与高频面试题示范

Promise是啥,直接上图:Promise就是处理异步函数的API,它可以包裹一个异步函数,在异步函数完成时抛出完成状态,让代码结束远古时无限回掉的窘境。配合async/await语法糖,可...

宇宙厂:为什么前端离不开 Promise.withResolvers() ?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.为什么需要Promise.with...

Promise 新增了一个超实用的 API!

在JavaScript的世界里,Promise一直是处理异步操作的神器。而现在,随着ES2025的发布,Promise又迎来了一个超实用的新成员——Promise.try()!这个新方法简...

一次搞懂 Promise 异步处理(promise 异步顺序执行)

PromisePromise就像这个词的表面意识一样,表示一种承诺、许诺,会在后面给出一个结果,成功或者失败。现在已经成为了主流的异步编程的操作方式,写进了标准里面。状态Promise有且仅有...

Promise 核心机制详解(promise机制的实现原理)

一、Promise的核心状态机Promise本质上是一个状态机,其行为由内部状态严格管控。每个Promise实例在创建时处于Pending(等待)状态,此时异步操作尚未完成。当异步操作成功...

javascript——Promise(js实现promise)

1.PromiseES6开始支持,Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。简单说就是处理异步请求的。之所以叫Promise,就是我承诺,如果成功则怎么处理,失败怎...

取消回复欢迎 发表评论: