Hive排序,窗口函数

news2024/9/25 3:29:18

数据排序

1,全局排序(order by):类似于标准SQL,只使用一个Reducer执行全局数据排序;速度慢,应提前做好数据过滤 ;支持使用case when或表达式;支持按位置编号排序

desc升序,asc降序,不写desc和asc情况下,就是默认asc降序排列

select * from t_window order by cost;

2,每个reduce内部排序(sort by):对于大规模的数据集 order by 的效率非常低。在很多情况下,并不需要全局排序,此时可以使用 sort by。

//设置reduce个数为3个,当个数设置为1的时候,等于全局排序order by
set mapreduce.job.reduces=3;
//查看设置reduce个数
set mapreduce.job.reduces;

3,分区排序(distribute by):在有些情况下,我们需要控制某个特定行应该到哪个 reducer,通常是为了进行后续的聚集操作。

注:distribute by 的分区规则是根据分区字段的 hash 码与 reduce 的个数进行模除后,余数相同的分到一个区。
Hive 要求 DISTRIBUTE BY 语句要写在 SORT BY 语句之前
//设置reduce个数
set mapreduce.job.reduces=3;
//先按日期分区,再按金额降序
select * from t_window distribute by orderdate sort by cost desc;

4,簇排序(cluster by):当 distribute by 和 sorts by 字段相同时,可以使用 cluster by 方式。

cluster by 除了具有 distribute by 的功能外还兼具 sort by 的功能。但是排序只能是升序排序,不能指定排序规则为 asc 或者 desc。

cluster by = distribute by +sort by 

select * from t_window cluster by cost
select * from t_window distribute by orderdate sort by cost desc;

窗口函数

窗口函数简单的说就是在执行聚合函数的时候指定一个操作窗口,这个窗口由over来进行控制。接下来重点介绍一下over()函数。

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

基本语法如下:<分析函数> over ( partition by <分组> order by <排序> desc/asc rows between 开始行 and 结束行 )
preceding:往前;following: 往后;current row:当前行;
unbounded :起点(一般结合preceding,following使用);
unbounded preceding: 表示该窗口最前面的行(起点);
unbounded following:该窗口最后面的行(终点)
rows between unbounded preceding and current row  --(表示从窗口起点到当前行)
rows between unbounded preceding and unbounded following--(表示从窗口起点到终点)
rows between 2 preceding and 1 following     --(表示往前2行到往后1行)
rows between 2 preceding and 1 current row   --(表示往前两行到当前行)
rows between current row and unbounded following   --(表示当前行到终点)

案例

数据:字段分别为name,orderdate,cost

jack,2015-01-01,10
tony,2015-01-02,15
jack,2015-02-03,23
tony,2015-01-04,29
jack,2015-01-05,46
jack,2015-04-06,42
tony,2015-01-07,50
jack,2015-01-08,55
mart,2015-04-08,62
mart,2015-04-09,68
neil,2015-05-10,12
mart,2015-04-11,75
neil,2015-06-12,80
mart,2015-04-13,94

聚合函数+over

count(),sum(),max(),min(),avg()……over()
//方法一
select distinct name, count(*) over ()
from orders
where substring(orderdate, 1, 7) = '2015-04';
//方法二
select name, count(*) over ()
from orders
where substring(orderdate, 1, 7) = '2015-04'
group by name;
注:group by 有去重效果

序列函数

ntile(n):用于将分组数据按照顺序切分成n片,返回当前切片值

select name,
       orderdate,
       cost,
       -- 全局数据切片
       ntile(5) over ()                                      as row1,
       -- 按照name进行分组,在分组内将数据切成3份
       ntile(3) over (partition by name)                     as row2,
       -- 全局按照name升序排列,数据切成3份
       ntile(3) over (order by name )                        as row3,
       -- 按照name分组,在分组内按照cost升序排列,数据切成3份
       ntile(3) over (partition by name order by cost desc ) as row4
from orders;

排名函数:rank(),dense_rank(),row_number()

rank()

生成数据项在分组中的排名,排名相等会在名次中留下空位

dense_rank()

生成数据项在分组中的排名,排名相等会在名次中不会留下空位

row_number()

从1开始,按照顺序,生成分组内记录的序列,不会存在重复,当排序的值相同时,按照表中记录的顺序进行排列

select name,
       orderdate,
       cost,
       row_number() over (partition by name order by cost desc ) as row1,
       rank() over (partition by name order by cost desc )       as row2,
       dense_rank() over (partition by name order by cost desc ) as row3
from orders;

lag():分区内滞后当前行的参数值

lead():分区内当前行前导行的参数值

select name,
       cost,
       lag(orderdate, 1, '1900-01-01') over (partition by name order by orderdate) as row1,
       orderdate,
       lead(orderdate) over (partition by name order by orderdate)                 as row2
from orders;

first_value取分组内排序后,截止到当前行,第一个值

last_value取分组内排序后,截止到当前行,最后一个值

select name,
       orderdate,
       cost,
       first_value(orderdate) over (partition by name order by orderdate) as row1,
       last_value(orderdate) over (partition by name order by orderdate)  as row2
from orders;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

拉链表

每日的用户更新表获取的三种方式&#xff1a;一是监听mysql库数据的变化&#xff0c;比如用canal合并每日的变化&#xff0c;获取到最后的一个状态二是每天获得一份切片数据&#xff0c;可以通过去两天切片数据的不同来作为每日更新表&#xff0c;可以对所有字段先进性concat&a…

Pixhawk RPi CM4 Baseboard 树莓派CM4安装Ubuntu20.04 server 配置ros mavros mavsdk

文章目录硬件安装Ubuntu Server20.04下载rpiboot工具下载imager刷写系统配置USB配置WIFI开机安装桌面配置wifi配置串口安装ROS安装mavros安装MAVSDK-PythonInternet设置最后参考&#xff1a; https://docs.holybro.com/autopilot/pixhawk-baseboards/pixhawk-rpi-cm4-baseboard…

Linux下C/C++ 网络扫描(主机扫描技术)

主机扫描是网络扫描的基础&#xff0c;通过对目标网络中主机IP地址的扫描&#xff0c;从一堆主机中扫描出存活的主机&#xff0c;然后以他们为目标进行后续的攻击。一般会借助于ICMP、TCP、UDP等协议的工作机制&#xff0c;检查打开的进程&#xff0c;开放的端口号等等。 主机…

SpringBoot使用缓存

目录 简介 Spring 的缓存主要有如下几个注解 红色标注的注解为最常用的注解&#xff0c;必须熟练掌握 Cacheable/CachePut/CacheEvict 主要的参数 SpEL 提供的运算符 实现步骤 补充 注意 整合 EHCACHE 简介 Spring 框架已经具备了缓存机制&#xff0c;虽然我们可以使用 …

Locust框架从0到1入门

Locust介绍 Locust是使用Python语言编写实现的开源性能测试工具&#xff0c;可以用来测试Web应用程序、API、数据库等各种应用程序的性能&#xff0c;使用起来简洁、轻量、高效&#xff0c;并发机制基于gevent协程&#xff0c;可以实现单机模拟生成较高的并发压力。中文意为&a…

【目标检测】正负样本分配策略

YOLO v3 目标的中心点在哪个网格内由该网格负责预测该目标&#xff0c;max-iou matching策略 &#xff08;1&#xff09;计算GT的中心点在哪个网格&#xff1b; &#xff08;2&#xff09;计算该网格内的所有anchor与GT的IOU&#xff0c;选择IOU最大的anchor负责预测该GT&…

嵌入安防监控项目——BOA服务器的移植

目录 一、源码下载 1.1 boa简介&#xff1a; 1.2BOA再项目中的使用 二、解压源码&#xff1a; 三、进入源码目录下的src目录&#xff1a; 四、make 编译源码&#xff1a; 五、建立安装目录 六、返回boa的顶层目录 --- 修改配置文件 七、建立测试页面 八、查看/boa目…

43-Golang中的goroutine!!!

Golang中的goroutine进程和线程说明并发和并行并发并行Go协程和Go主线程案例小结goroutine的调度机制MPG模式基本介绍MPG模式运行的状态1MPG模式运行的状态2设置GOlang运行的CPU数不同 goroutine之间如何通讯使用全局变量加锁同步改进程序进程和线程说明 1.进程就是程序在操作…

robosuite添加无碰撞的模型

1 前言 最近在使用robosuite时,需要在仿真环境中可视化物体的目标位置,从而方便观察训练情况,可视化的物体有以下要求: 形状尺寸与操作的物体一样半透明只有visual,不与场景其他物体有碰撞可以在每次step后设置位置,且固定在设定的位置,不受重力影响 2 方法 找了半天,最终确…

javaWeb核心04-CookieSession

文章目录会话技术1&#xff0c;会话跟踪技术的概述2&#xff0c;Cookie2.1 Cookie的基本使用2.2 Cookie的原理分析2.3 Cookie的使用细节2.3.1 Cookie的存活时间2.3.2 Cookie存储中文3&#xff0c;Session3.1 Session的基本使用3.2 Session的原理分析3.3 Session的使用细节3.3.1…

2018年MathorCup数学建模D题公交移动支付问题的评估方案解题全过程文档及程序

2018年第八届MathorCup高校数学建模挑战赛 D题 公交移动支付问题的评估方案 原题再现&#xff1a; 随着智能手机的普及和移动支付技术的提高,越来越多的支付手段可以转移到手机端。现有的现金缴费和实体公交卡刷卡的付费方式存在缺点&#xff0c;如公交卡在使用过程中存在着充…

Landsat8中*_MTL.txt文件详解

01 什么是*_MTL.txt文件&#xff1f;所有的Landsat8 1级数据产品中均包含MTL.txt(Metadata File)文件。Landsat MTL文件包含对数据的系统搜索和归档分类有益的信息。该文件还包含关于数据处理和恶对增强陆地卫星数据有重要价值的信息&#xff08;例如转换为反射率和辐射亮度&am…

Java 集合进阶(二)

文章目录一、Set1. 概述2. 哈希值3. 元素唯一性4. 哈希表5. 遍历学生对象6. LinkedHashSet7. TreeSet7.1 自然排序7.2 比较器排序8. 不重复的随机数二、泛型1. 概述2. 泛型类3. 泛型方法4. 泛型接口5. 类型通配符6. 可变参数7. 可变参数的使用一、Set 1. 概述 Set 集合特点&am…

AI领域通识

人工智能的架构&#xff1a;通常来说&#xff0c;人工智能架构分为四层&#xff1a;最底层的基础层一般由软硬件设施以及数据服务组成。软件设施主要包括智能云平台和大数据平台&#xff0c;比如国外的谷歌大数据平台和国内的百度智能云平台等&#xff1b;硬件设施主要包括CPU硬…

讨论基于最新的(v5或v6版本)UXP插件开发的开发框架的选择问题

看过我的上两篇文章后&#xff0c;相信你对UXP的开发环境已经有一定了解了&#xff0c;然后这里讨论一个问题&#xff0c;UXP的开发可以基于纯htmlcssjs、vue框架、react框架、svelte框架&#xff0c;就是到底用哪种方式开发更好了&#xff1f;一般情况是用自己最熟悉的或者是使…

使用vue脚手架创建vue项目

大家好&#xff0c;这里是 一口八宝周 &#x1f44f;欢迎来到我的博客 ❤️一起交流学习文章中有需要改进的地方请大佬们多多指点 谢谢 &#x1f64f;使用脚手架创建vue项目步骤&#xff1a;切换淘宝镜像npm config set registry https://registry.npm.taobao.org安装脚手架npm…

算法拾遗二十七之窗口最大值或最小值的更新结构

算法拾遗二十七之窗口最大值或最小值的更新结构滑动窗口题目一题目二题目三题目四滑动窗口 第一种&#xff1a;R&#xff0c;R右动&#xff0c;数会从右侧进窗口 第二种&#xff1a;L&#xff0c;L右动&#xff0c;数从左侧出窗口 题目一 arr是N&#xff0c;窗口大小为W&…

C++ linux下获取时间戳 秒、微妙、纳秒

1.例子#include <iostream>#include <sys/time.h>#include <cstdlib>#include <cstdio>#include <ctime>#include <cmath>#include <unistd.h>usingnamespace std;time_t clocktime(){time_t t time(NULL);std::cout << &quo…

聚势合力,电巢与SDIA协会“战略合作签约仪式”圆满落成

前言&#xff1a; 2023年03月02日下午&#xff0c;电巢科技与深圳市平板显示行业协会齐聚深圳南山电巢XR演播厅&#xff0c;共同举办了隆重的战略合作签约仪式。 双方就数字化建设、品牌赋能、人才培养、技术创新等企业服务深入合作上达成一致&#xff0c;合力为产业赋能&…

【OJ比赛日历】快周末了,不来一场比赛吗? #03.11-03.17 #12场

CompHub 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号同时会推送最新的比赛消息&#xff0c;欢迎关注&#xff01;更多比赛信息见 CompHub主页 或 点击文末阅读原文以下信息仅供参考&#xff0c;以比赛官网为准目录2023-03-11&…