Hive 函数

分类

  • Hive 的函数分为两大类:内置函数(Built-in-Functions)、用户自定义函数(User-Defined-Functions);
  • 内置函数可分为:数值类型函数、日期类型函数、字符串类型函数、集合函数等;
  • 用户自定义函数根据输入输出的行数可分为3类:UDF、UDAF、UDTF;

内置函数

  • String Function 字符串函数
  • Date Function 日期函数
  • Mathematical Function 数学函数
  • Collection Function 集合函数
  • Conditional Function 条件函数
  • Type Conversion Function 类型转换函数
  • Data Masking Function 数据脱敏函数
  • Misc. Function 其他杂项函数

用户自定义函数

在这里插入图片描述

  • UDF(User-Defined-Function) 普通函数,一进一出;
    例如:round 这样的函数;
    在这里插入图片描述

  • UDAF(User-Defined Aggregation Function)聚合函数,多进一出;
    例如:count、sum 这样的函数;
    在这里插入图片描述

  • UDTF(User-Defined Table-Generating Function)表生成函数,一进多出;
    例如:explode 函数
    在这里插入图片描述

UDF实现步骤

0、添加 pom 依赖;
在这里插入图片描述

1、写一个 Java 类,集成 UDF ,并重载 evaluate 方法,方法中实现函数的业务逻辑;

2、重载意味着可以在一个 Java 类中实现多个函数功能;

3、程序打成 jar 包,上传到 HS2 服务器或者 HDFS;

4、客户端命令行中添加 jar 包到 Hive 的 classpath :add JAR /xxx/udf.jar;

5、注册称为临时函数(给 UDF 命名):create temporary function 函数名 as ‘UDF 类全路径’;

6、HQL 中使用函数;

Hive 常用高阶函数

UDTF explode 函数

  • explode 接收 map、array 类型的数据作为输入,然后把输入数据中的每个元素拆开变成一行数据,一个元素一行;
  • explode(array) 将 array 里的每个元素生成一行;
  • explode(map) 将 map 里的每一对元素作为一行,其中 key 为一列,value 为一列;
  • explode 执行的结果可以理解为一张虚拟的表,其数据来源于源表;

UDTF 语法限制

  • 在 select 中只查询源表数据没有问题,只查询 explode 生成的虚拟表数据也没问题,但是不能在只查询源表的时候,既想返回源表字段,又想返回 explode 生成的虚拟表字段;简而言之,有两张表,不能只查询一张表但是又想返回分别属于两张表的字段;在这里插入图片描述

UDTF 语法限制解决

  • SQL 层面上的解决方案是:对两张表进行 join 关联查询;
  • Hive 专门提供了语法 lateral View 侧视图,专门用于搭配 explode 这样的 UDTF 函数;
select a.team_name, b.year from the_nba_championship a lateral view explode(champion_year) b as year;

Lateral View 侧视图

  • Lateral View 是一种特殊的语法,主要是搭配 UDTF 类型函数一起使用,用于解决 UDTF 函数的一些查询限制的问题;
  • 一般只要使用 UDTF,就会固定搭配 lateral view 使用;

原理

  • 将 UDTF 的结果构建成一个类似于视图的表,然后将原表中的每一行和 UDTF 函数输出的每一行进行连接,生成新的虚拟表。这样就避免了 UDTF 的使用限制问题;
  • 使用 lateral view 时也可以对 UDTF 产生的记录设置字段名称,产生的字段可以用于 group by、order by limit 等语句中,不需要再单独嵌套一层子查询;
    在这里插入图片描述

增强聚合函数

  • 增强聚合包括 grouping sets 、cube、rollup 这几个函数。主要适用于 OLAP 多维数据分析模式中。多维分析中的多维指的分析问题时看待问题的维度、角度;

grouping_sets
一种将多个 group by 逻辑写在一个 SQL 语句中的便利写法。等价于将不同维度的 group by 进行 union all。GROUPING_ID 表示结果属于哪一个分组集合;
例子:

SELECT month, day, COUNT(DISTINCT cookieid) AS nums, GROUPING__ID
FROM cookie_info
GROUP BY month, day GROUPING SETS (month, day)
ORDER BY GROUPING__ID;
--grouping_id 表示这一组结果属于哪个分组集合
--根据grouping sets中的分组条件month,day,1代表month,2代表day

等价于

SELECT month, NULL, COUNT(DISTINCT cookieid) AS nums, 1 AS GROUPING__ID
FROM cookie_info
GROUP BY month
UNION ALL
SELECT NULL as month, day, COUNT(DISTINCT cookieid) AS nums, 2 AS GROUPING__ID
FROM cookie_info
GROUP BY day;

cube
cube 表示根据 group by 的维度的所有组合进行聚合,如果有n个维度,则所有组合的总个数是2^n。比如cube有a,b,c 3个维度,则所有组合情况是: (a,b,c),(a,b),(b,c),(a,c),(a),(b),©,()

SELECT month, day, COUNT(DISTINCT cookieid) AS nums, GROUPING__ID
FROM cookie_info
GROUP BY month, day
WITH CUBE
ORDER BY GROUPING__ID;

等价于

SELECT NULL, NULL, COUNT(DISTINCT cookieid) AS nums, 0 AS GROUPING__ID
FROM cookie_info
UNION ALL
SELECT month, NULL, COUNT(DISTINCT cookieid) AS nums, 1 AS GROUPING__ID
FROM cookie_info
GROUP BY month
UNION ALL
SELECT NULL, day, COUNT(DISTINCT cookieid) AS nums, 2 AS GROUPING__ID
FROM cookie_info
GROUP BY day
UNION ALL
SELECT month, day, COUNT(DISTINCT cookieid) AS nums, 3 AS GROUPING__ID
FROM cookie_info
GROUP BY month, day;

rollup
rollup 是 cube 的子集,以最左侧的维度为主,从该维度进行层级聚合。比如ROLLUP有a,b,c3个维度,则所有组合情况是:(a,b,c),(a,b),(a),();

-- --比如,以month维度进行层级聚合:
SELECT month, day, COUNT(DISTINCT cookieid) AS nums, GROUPING__ID
FROM cookie_info
GROUP BY month, day
WITH ROLLUP
ORDER BY GROUPING__ID;
--把month和day调换顺序,则以day维度进行层级聚合:
SELECT day, month, COUNT(DISTINCT cookieid) AS uv, GROUPING__ID
FROM cookie_info
GROUP BY day, month
WITH ROLLUP
ORDER BY GROUPING__ID;

Window Function 窗口函数

  • 窗口函数也叫开窗函数,OLAP 函数,其最大的特点是:输入值是从 select 语句的结果集中一行或多行的“窗口”中获取的;
  • 如果函数具有 over 子句,则它是窗口函数;
  • 窗口函数可以简单地解释为类似于聚合函数的计算函数,但是通过 group by 子句组合的常规聚合会隐藏正在聚合的各个行,最终输出一行,窗口函数聚合后还可以访问当中的各个行,并且可以将这些行中的某些属性添加到结果集中;

在这里插入图片描述

例子:通过sum聚合函数进行普通常规聚合和窗口聚合,来直观感受窗口函数的特点;

----sum+group by普通常规聚合操作------------
select sum(salary) as total
from employee
group by dept;

在这里插入图片描述

----sum+窗口函数聚合操作------------
select id, name, deg, salary, dept, sum(salary) over (partition by dept) as total
from employee;

在这里插入图片描述

窗口聚合函数

  • 所谓窗口聚合函数指的是 sum、max、min、avg 这样的聚合函数在窗口中的使用;

以 sum 为例:

--1、求出每个用户总pv数  sum+group by普通常规聚合操作
select cookieid,sum(pv) as total_pv from website_pv_info group by cookieid;
--2、sum+窗口函数 总共有四种用法 注意是整体聚合 还是累积聚合
-- --sum(...) over( )对表所有行求和
-- --sum(...) over( order by ... ) 连续累积求和
-- --sum(...) over( partition by... ) 同组内所行求和
-- --sum(...) over( partition by... order by ... ) 在每个分组内,连续累积求和

在这里插入图片描述
在这里插入图片描述

窗口表达式

  • 在 sum(…) over(partition by … order by …)语法完整的情况下,进行累积聚合操作,默认累积聚合行为是从第一行聚合到当前行;
  • 窗口表达式给我们提供了一种控制执行范围的能力,比如向前2行,向后3行;
    在这里插入图片描述
--第一行到当前行
select cookieid,createtime,pv,sum(pv) over (partition by cookieid order by createtime rows between unbounded preceding and current row) as pv2
from website_pv_info;
--向前3行至当前行
select cookieid,createtime,pv,sum(pv) over (partition by cookieid order by createtime rows between 3 preceding and current row) as pv4
from website_pv_info;
--向前3行 向后1行
select cookieid,createtime,pv,sum(pv) over (partition by cookieid order by createtime rows between 3 preceding and 1 following) as pv5
from website_pv_info;
--当前行至最后一行
select cookieid,createtime,pv,sum(pv) over (partition by cookieid order by createtime rows between current row and unbounded following) as pv6
from website_pv_info;
--第一行到最后一行 也就是分组内的所有行
select cookieid,createtime,pv,sum(pv)over (partition by cookieid order by createtime rows between unbounded preceding and unbounded following) as pv6
from website_pv_info;

窗口排序函数

  • 用于给每个分组内的数据打上排序的标号,注意窗口排序函数不支持窗口表达式;
  • 适合用于 Top N 业务分析;

row_number:在每个分组中,为每行分配一个从1开始的序列号,递增,不考虑重复;
rank:在每个分组中,为每行分配一个从1开始的序列号,考虑重复,挤占后续位置;
dense_rank:在每个分组中,为每行分配一个从1开始的序列号,考虑重复,不挤占后续位置;

SELECT cookieid,createtime,pv,RANK() OVER (PARTITION BY cookieid ORDER BY pv desc)       AS rn1,DENSE_RANK() OVER (PARTITION BY cookieid ORDER BY pv desc) AS rn2,ROW_NUMBER() OVER (PARTITION BY cookieid ORDER BY pv DESC) AS rn3
FROM website_pv_info
WHERE cookieid = 'cookie1';

在这里插入图片描述

ntile:将每个分组内的数据分为指定的若干个桶里,并且为每一个桶分配一个桶编号。如果不能平均分配,则优先分配较小编号的桶,并且各个桶中能放的行数最多相差1;

--把每个分组内的数据分为3桶
SELECT cookieid, createtime, pv, NTILE(3) OVER (PARTITION BY cookieid ORDER BY createtime) AS rn2
FROM website_pv_info
ORDER BY cookieid, createtime;

在这里插入图片描述

窗口分析函数

  • LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值
    第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时,取默认值,如不指定,则为NULL);

  • LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值
    第一个参数为列名,第二个参数为往下第n行(可选,默认1),第三个参数为默认值(当往下第n行为NULL时,取默认值,如不指定,则为NULL);

  • FIRST_VALUE 取分组内排序后,截至到当前行,第一个值;

  • LAST_VALUE 取分组内排序后,截至到当前行,最后一个值;

--LAG
SELECT cookieid,createtime,url,ROW_NUMBER() OVER (PARTITION BY cookieid ORDER BY createtime)                              AS rn,LAG(createtime, 1, '1970-01-01 00:00:00')OVER (PARTITION BY cookieid ORDER BY createtime)                                       AS last_1_time,       LAG(createtime, 2) OVER (PARTITION BY cookieid ORDER BY createtime) AS last_2_time
FROM website_url_info;
--LEAD
SELECT cookieid,createtime,url,ROW_NUMBER() OVER (PARTITION BY cookieid ORDER BY createtime) AS rn,       LEAD(createtime, 1, '1970-01-01 00:00:00') OVER (PARTITION BY cookieid ORDER BY createtime) AS next_1_time,       LEAD(createtime, 2) OVER (PARTITION BY cookieid ORDER BY createtime) AS next_2_time
FROM website_url_info;
--FIRST_VALUE
SELECT cookieid,createtime,url,ROW_NUMBER() OVER (PARTITION BY cookieid ORDER BY createtime)     AS rn,FIRST_VALUE(url) OVER (PARTITION BY cookieid ORDER BY createtime) AS first1
FROM website_url_info;
--LAST_VALUE
SELECT cookieid,createtime,url,ROW_NUMBER() OVER (PARTITION BY cookieid ORDER BY createtime) AS rn,       LAST_VALUE(url) OVER (PARTITION BY cookieid ORDER BY createtime) AS last1
FROM website_url_info;

sampling 抽样函数

  • 在 HQL 中,可以通过三种方式采样数据:随机采样,存储桶表采样和块采样;

Random 随机采样

  • 使用 rand() 函数来确保随机获取数据,LIMIT 来限制抽取个数;
  • 优点是随机,缺点是速度不快,尤其是表数据多的时候;
  • 推荐 distribute + sort ,可以确保数据也随机分布在 mapper 和 reducer 之间,使得底层执行有效率;
--需求:随机抽取2个学生的情况进行查看
SELECT *
FROM student DISTRIBUTE BY rand() SORT BY rand() LIMIT 2;

在这里插入图片描述

Block 基于数据块抽样

  • Block 块采样允许随机获取n行数据、百分比数据或指定大小的数据;
  • 采样的粒度是 HDFS 块大小;
  • 优点是速度快,缺点是不随机;
--block抽样
--根据行数抽样
SELECT * FROM student TABLESAMPLE (1 ROWS);
--根据数据大小百分比抽样
SELECT * FROM student TABLESAMPLE (50 PERCENT);
--根据数据大小抽样
--支持数据单位 b/B, k/K, m/M, g/G
SELECT * FROM student TABLESAMPLE (1k);

Bucket table 基于分桶表抽样

  • 这是一种特殊的采样方法,针对分桶表进行了优化;
  • 优点是即随机,速度又很快;
---bucket table抽样
--根据整行数据进行抽样
SELECT * FROM t_usa_covid19_bucket TABLESAMPLE(BUCKET 1 OUT OF 2 ON rand());
--根据分桶字段进行抽样 效率更高
SELECT * FROM t_usa_covid19_bucket TABLESAMPLE(BUCKET 1 OUT OF 2 ON state);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/378312.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis-基础概念

目录 概念 Redis是什么 Redis 和 MySQL 的区别? Redis单线程有什么极端场景的瓶颈 Redis为什么快? 为什么Redis是单线程? Redis是单线程还是多线程 Redis为什么选择单线程做核心处理 Redis6.0之后引入了多线程,你知道为什么吗? 瓶颈是内存和I…

php相关

php相关 ​ 借鉴了小迪安全以及各位大佬的博客,如果一切顺利,会不定期更新。 如果感觉不妥,可以私信删除。 默认有php基础。 文章目录 php相关1. php 缺陷函数1. 与2. MD53. intval()4. preg_match() 2. php特性1. php字符串解析特性2. 杂…

用switch实现多分支选择结构

一 例子引入 #include<stdio.h> int main&#xff08;) {char grade&#xff1b;scanf("%c"&#xff0c;&grade);printf("Your score:");switch (grade){case A: printf("85~100\n"); break;case B: printf("70~84\n");br…

深度学习落地实战:识别火车票信息

前言 大家好&#xff0c;我是机长 本专栏将持续收集整理市场上深度学习的相关项目&#xff0c;旨在为准备从事深度学习工作或相关科研活动的伙伴&#xff0c;储备、提升更多的实际开发经验&#xff0c;每个项目实例都可作为实际开发项目写入简历&#xff0c;且都附带完整的代…

嵌入式人工智能(9-基于树莓派4B的PWM-LED呼吸灯)

1、PWM简介 (1)、什么是PWM 脉冲宽度调制(PWM)&#xff0c;是英文“Pulse Width Modulation”的缩写&#xff0c;简称脉宽调制&#xff0c;是在具有惯性的系统中利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术&#xff0c;广泛应用在从测量、通信到功率控制…

在 Linux 系统中安装MySQL 8.x(Ubuntu和CentOS)

文章目录 0. 前言1. 查看 Linux 的发行版本2. 在 Ubuntu 中安装MySQL 8.x2.1 更新包索引2.1.1 更改 Ubuntu 的镜像源2.1.2 更新软件包、升级软件包&#xff08;耗时可能较长&#xff09;2.1.3 可能遇到的问题 2.2 安装MySQL2.3 安全配置2.3.1 密码安全级别2.3.2 删除匿名用户2.…

华为HCIP Datacom H12-821 卷41

1.多选题 以下关于BGP Atomic_Aggregate和Aggregator的描述&#xff0c;正确的是哪些项? A、Aggregator属性属于可选过渡属性 B、Atomic_Aggregate属于公认任意属性 C、收到携带Atomic_Aggregate属性的路由表示这条路由不能再度明细化 D、 Agregator表示某条路由可能出现…

各类专业技术的pdf电子书

从业多年&#xff0c;收集了海量的pdf电子书籍&#xff0c;感兴趣的私聊。

设计模式学习(二)工厂模式——抽象工厂模式+注册表

设计模式学习&#xff08;二&#xff09;工厂模式——抽象工厂模式注册表 前言使用简单工厂改进使用注册表改进参考文章 前言 在上一篇文章中我们提到了抽象工厂模式初版代码的一些缺点&#xff1a;①客户端违反开闭原则②提供方违反开闭原则。本文将针对这两点进行讨论 使用…

【node-RED 4.0.2】连接 Oracle 数据库踩坑解决,使用模组:node-red-contrib-agur-connector

关于 Oracle Oracle 就好像一张吸满水的面巾纸&#xff0c;你稍一用力它就烂了。 PS&#xff1a;我更新了更好的模组的教程&#xff0c;这篇已经是旧款的教程&#xff0c;但是它仍旧包含了必要的配置环境变量等操作。 最新的模组教程&#xff1a;node-red-contrib-agur-connec…

数据湖仓一体(一) 编译hudi

目录 一、大数据组件版本信息 二、数据湖仓架构 三、数据湖仓组件部署规划 四、编译hudi 一、大数据组件版本信息 hudi-0.14.1zookeeper-3.5.7seatunnel-2.3.4kafka_2.12-3.5.2hadoop-3.3.5mysql-5.7.28apache-hive-3.1.3spark-3.3.1flink-1.17.2apache-dolphinscheduler-3.1.9…

基于AT89C51单片机的16×16点阵LED显示器字符滚动显示设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机的1616点阵LED显示器字符滚动显示设计的详情介绍&#xff0c;如果对您有帮助的话&#xff0c;还请关注一下哦&#xff0c;如果有资源方面的需要可以联系我。 目录 仿真效果图 仿真图 代码 系统论文 资源下载 设计的内容和要求 熟悉51系…

基于视觉工具箱和背景差法的行人检测,行走轨迹跟踪,人员行走习惯统计matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 在三维图中&#xff0c;幅度越大&#xff0c;则表示人员更习惯的行走路线。 2.算法运行软件版本 matlab2022a 3.部分核…

css基础(1)

CSS CCS Syntax CSS 规则由选择器和声明块组成。 CSS选择器 CSS选择器用于查找想要设置样式的HTML元素 一般选择器分为五类 Simple selectors (select elements based on name, id, class) 简单选择器&#xff08;根据名称、id、类选择元素&#xff09; //页面上的所有 …

【经验分享】关于静态分析工具排查 Bug 的方法

文章目录 编译器的静态分析cppcheck安装 cppcheck运行 cppcheck 程序员的日常工作&#xff0c;不是摸鱼扯皮&#xff0c;就是在写 Bug。虽然这是一个梗&#xff0c;但也可以看出&#xff0c;程序员的日常一定绕不开 Bug。而花更少的时间修复软件中的 Bug&#xff0c;且不引入新…

Bug:时间字段显示有问题

Bug&#xff1a;时间字段显示有问题 文章目录 Bug&#xff1a;时间字段显示有问题1、问题2、解决方法一&#xff1a;添加注解3、解决方法二&#xff1a;消息转换器自定义对象映射器配置消息转换器 1、问题 ​ 在后端传输时间给前端的时候&#xff0c;发现前端的时间显示有问题…

汽车开发阶段(OTS/VFF/PVS/OS/SOP)

OTS&#xff1a;即英语中的Off Tooling Sample&#xff0c;通常被称为工装样件。它指的是通过配套设备、工装夹具以及模具制造出来的样品&#xff0c;但并不强调生产的时间效率&#xff0c;主要用于验证产品的设计能力。 VFF&#xff1a;在德语中表示为Vorserien Freigabefahr…

太速科技-FMC207-基于FMC 两路QSFP+光纤收发子卡

FMC207-基于FMC 两路QSFP光纤收发子卡 一、板卡概述 本卡是一个FPGA夹层卡&#xff08;FMC&#xff09;模块&#xff0c;可提供高达2个QSFP / QSFP 模块接口&#xff0c;直接插入千兆位级收发器&#xff08;MGT&#xff09;的赛灵思FPGA。支持利用Spartan-6、Virtex-6、Kin…

eNsp公司管理的网络NAT策略搭建

实验拓扑图 实验需求&#xff1a; 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 8&#xff0c;分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 9&#xff0c;多出口环境基于带…

JavaWeb(四:Ajax与Json)

一、Ajax 1.定义 Ajax&#xff08;Asynchronous JavaScript And XML&#xff09;&#xff1a;异步的 JavaScript 和 XML AJAX 不是新的编程语言&#xff0c;指的是⼀种交互方式&#xff1a;异步加载。 客户端和服务器的数据交互更新在局部页面的技术&#xff0c;不需要刷新…