hive窗口函数_Hive sql窗口函数源码分析

在了解了窗口函数实现原理 spark、hive中窗口函数实现原理复盘 和 sparksql比hivesql优化的点(窗口函数)之后,今天又撸了一遍hive sql 中窗口函数的源码实现,写个笔记记录一下。

简单来说,窗口查询有两个步骤:将记录分割成多个分区;然后在各个分区上调用窗口函数。

传统的 UDAF 函数只能为每个分区返回一条记录,而我们需要的是不仅仅输入数据是一张表,输出数据也是一张表(table-in, table-out),因此 Hive 社区引入了分区表函数 Partitioned Table Function (PTF)。

1、代码流转图

PTF 运行在分区之上、能够处理分区中的记录并输出多行结果的函数。

f4b0a392adce72f084f2f7f986f43fc1.png

hive会把QueryBlock,翻译为执行操作树OperatorTree,其中每个operator都会有三个重要的方法:

  • initializeOp()  --初始化算子

  • process()    --执行每一行数据

  • forward()   --把处理好的每一行数据发送到下个Operator

当遇到窗口函数时,会生成PTFOperator,PTFOperator 依赖PTFInvocation读取已经排好序的数据,创建相应的输入分区:PTFPartition inputPart;

WindowTableFunction 负责管理窗口帧、调用窗口函数(UDAF)、并将结果写入输出分区: PTFPartition outputPart。

2、其它细节

PTFOperator.process(Object row, int tag)-->PTFInvocation.processRow(row)

void processRow(Object row) throws HiveException {  if ( isStreaming() ) {    handleOutputRows(tabFn.processRow(row));  } else {    inputPart.append(row);     //主要操作就是把数据 append到 ptfpartition中,这里的partition与map-reduce中的分区不同,map-reduce分区是按照key的hash分,而这里是要把相同的key要放在同一个ptfpartition,方便后续的windowfunction操作  }}

真正对数据的操作是当相同的key完全放入同一个ptfpartition之后,时机就是finishPartition:

void finishPartition() throws HiveException {  if ( isStreaming() ) {    handleOutputRows(tabFn.finishPartition());  } else {    if ( tabFn.canIterateOutput() ) {      outputPartRowsItr = inputPart == null ? null :        tabFn.iterator(inputPart.iterator());    } else {      outputPart = inputPart == null ? null : tabFn.execute(inputPart);       //这里TableFunctionEvaluator      outputPartRowsItr = outputPart == null ? null : outputPart.iterator();    }    if ( next != null ) {      if (!next.isStreaming() && !isOutputIterator() ) {        next.inputPart = outputPart;      } else {        if ( outputPartRowsItr != null ) {          while(outputPartRowsItr.hasNext() ) {            next.processRow(outputPartRowsItr.next());          }        }      }    }  }  if ( next != null ) {    next.finishPartition();  } else {    if (!isStreaming() ) {      if ( outputPartRowsItr != null ) {        while(outputPartRowsItr.hasNext() ) {          forward(outputPartRowsItr.next(), outputObjInspector);        }      }    }  }}

还有一个雷区,PTFPartition append():

public void append(Object o) throws HiveException {  if ( elems.rowCount() == Integer.MAX_VALUE ) {    //当一个ptfpartition加入的条数等于Integer.MAX_VALUE时会抛异常    throw new HiveException(String.format("Cannot add more than %d elements to a PTFPartition",        Integer.MAX_VALUE));  }  @SuppressWarnings("unchecked")  List<Object> l = (List<Object>)      ObjectInspectorUtils.copyToStandardObject(o, inputOI, ObjectInspectorCopyOption.WRITABLE);  elems.addRow(l);}

需要把相同key的数据完全放入一个ptfPartition进行操作,这时对加入的的条数做了限制,不能>=Integer.MAX_VALUE(21亿),这块需要注意。

我是小萝卜算子

在成为最厉害最厉害最厉害的道路上

很高兴认识你

~~ enjoy ~~

b1283a3cb281879c726c402065c1cdf9.png

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

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

相关文章

容大打印机ip修改工具_M1芯片版Mac无法连接打印机怎么办?

文末有优惠券在入手了M1芯片版MacBook Pro后&#xff0c;昨天我打算连接一下实验室的打印机。这个打印机的型号是HP LaserJet Professional M1213nf MFP&#xff0c;在同一个局域网内通过搜索IP即可连接。在我的旧设备2015款MacBook Air上&#xff0c;很轻松就连接了打印机。可…

语音对讲软件_三款语音转文字工具,语音输入,高效转换,准确率高

关于语音转文字的软件我在之前讲了很多&#xff0c;有些人听了也用了&#xff0c;效果不错&#xff0c;有些人看了就忘了&#xff0c;主要是不知道用它干嘛&#xff0c;其实语音转文字的软件主要功能就是为了让自己在写作的时候可以减少时间&#xff0c;提高效率&#xff0c;其…

野火stm32呼吸灯程序_说一说STM32启动过程

STM32上电后是怎么启动的&#xff1f;main函数之前单片机都做了些什么&#xff1f;带着这些疑问我们开始进入游戏。。。。。首先&#xff0c;开局一张图&#xff0c;过程全靠编&#xff0c;如有说错的地方望能指正启动大致流程1- 上电启动或者硬件复位2- 单片机从0x00地址开始执…

apache启动失败_请检查相关配置.√mysql5.1已启动._1、Apache启动失败,请检查相关配置-百度经验...

前几天电脑系统崩溃了,后边到服务中心重新恢复了系统,但是回来使用APMServ 5.2.6发现:1、Apache启动失败,请检查相关配置。√MySQL5.1已启动。系统的各种服务我都检查过了,都是正常开启的,百思不得其解,后边在百度上搜索一篇文章有个例子照做了以后结果成功了。---------------…

职业规划纵向横向_收下这份《职业规划喂饭式指南》

果不其然&#xff01;上篇文章发布后&#xff0c;我收到了被拿来举反例的网友小哥的抗议~~~讲道理&#xff0c;最后他拿到的Offer还是十分不错的&#xff0c;从此以后我的朋友圈又多了一位第一手保真瓜主&#xff0c;他好我也好~那么本期《职业规划喂饭式指南》来喽&#xff01…

javascript字典中添加数组_如何在 JavaScript 中更好地使用数组

在 freeCodeCamp 社区阅读原文。本文短小精悍&#xff0c;我保证。在过去的数个月里&#xff0c;我注意到在我审阅的 pull request 中有四个&#xff08;关于数组使用的&#xff09;错误经常出现。同时&#xff0c;我自己也会犯这些错误&#xff0c;因此有了这篇文章。让我们一…

mysql join图解_MySQL中Join算法实现原理分析[多图]

在MySQL 中&#xff0c;只有一种 Join 算法&#xff0c;就是大名鼎鼎的 Nested Loop Join&#xff0c;他没有其他很多数据库所提供的 Hash Join&#xff0c;也没有 Sort Merge Join。顾名思义&#xff0c;Nested Loop Join 实际上就是通过驱动表的结果集作为循环基础数据&#…

mysql多线程使用一个链接_探索多线程使用同一个数据库connection的后果

在项目中看到有用到数据库的连接池&#xff0c;心里就思考着为什么需要数据库连接池&#xff0c;只用一个连接会造成什么影响?(只用一个connection)?1 猜想:jdbc的事务是基于connection的&#xff0c;如果多线程共用一个connection&#xff0c;会造成多线程之间的事务相互干…

vs中四点画矩形的算法_中考热点,初高中衔接之倒角利器四点共圆

初中数学课程标准修改后&#xff0c;教材中四点共圆知识已经删除掉了&#xff0c;但这样一件强悍且使用简单的武器&#xff0c;我们还是有必要去了解的&#xff0c;近年来对于压轴题以几何为核心的考区来说&#xff0c;有时用到解题更为简洁方便&#xff0c;由此应该理解掌握。…

phpnow mysql字符集_使用PHPnow搭建本地PHP环境+创建MySQL数据库

要想学习WordPress建站&#xff0c;在本地搭建PHP环境是十分必要的&#xff0c;在以后的建站日子里&#xff0c;你可以使用这个环境来进行wordpress的程序学习、调试等工作&#xff0c;等你熟悉了wordpress以后&#xff0c;再购买域名和空间&#xff0c;真正开始你的建站之旅。…

wps如何保存最终状态_如何使得打开word文件显示最终的修改状态

展开全部 在日常工作中,经常为了保护文档而将其设置成最e68a84e8a2ad3231313335323631343130323136353331333363376366终状态,设置文档为最终状态,则是表示已完成这篇文档的编辑,这是文档的最终版本。如果文档被标记为最终状态,则状态属性将设置为“最终状态”,并且将禁用…

python整数反转_敲代码学Python:力扣简单算法之整数反转

学习重点&#xff1a;整数逆序算法力扣&#xff08;LeetCode&#xff09;原题​leetcode-cn.com 功能&#xff1a;整数反转 来源&#xff1a;https://leetcode-cn.com/explore/featured/card/top-interview-questions-easy/5/strings/33/ 重点&#xff1a;整数逆序算法 作者&am…

前端累加nan怎么解决_前端面试,你有必要知道的一些JavaScript 面试题(上)

1.使用 typeof bar “object” 判断 bar 是不是一个对象有神马潜在的弊端&#xff1f;如何避免这种弊端&#xff1f;使用 typeof 的弊端是显而易见的(这种弊端同使用 instanceof)&#xff1a;let obj {};let arr [];console.log(typeof obj object); //trueconsole.log(typ…

tidb 配置mysql数据源_安装tidb数据库

1.下载压缩包安装tar包路径命令&#xff1a;wget http://download.pingcap.org/tidb-latest-linux-amd64.tar.gz命令&#xff1a;wget http://download.pingcap.org/tidb-latest-linux-amd64.sha2562.检查文件完整性命令&#xff1a;sha256sum -c tidb-latest-linux-amd64.sha2…

linuxos或sv独立客户端不支持应用程序打开方式_搞不明白为什么大家都在学习 k8s

作者 | 小明菜市场来源 | 小明菜市场(ID&#xff1a;fileGeek)头图 | CSDN 下载自东方IC前言都2020年了&#xff0c;你还不知道kubernetes就真的真的真的out啦。(贩卖焦虑体) 什么是k8s&#xff0c;k8s这个词来自于希腊语&#xff0c;有主管&#xff0c;舵手&#xff0c;船长的…

react 图片放在src里面还是public_手写Webpack从0编译Vue/React项目

当前前端开发&#xff0c;90%的项目都是Vue和React&#xff0c;然而70%的同学都基于脚手架创建项目&#xff0c;因为脚手架会包含项目基本框架、webpack配置、scss/sass/less解析、babel配置、DevServer、JSX/Vue文件解析、CSS前缀等&#xff0c;我们要做的就是开发功能模块&am…

python 在线预览文件_用Python PyQt写一个在线预览图片的GUI

在爬完网上一篇帖子&#xff0c;并得到其中的所有图片链接后&#xff0c;写一个GUI来实现在线预览是一个很自然的想法&#xff0c; 相当于实现一个python版的图片浏览器&#xff0c; 通过这个练习&#xff0c;可以让我们更熟悉PyQt这个库。这里我用的是PyQt4。以下是我的写的程…

google 确定某点海拔高_一份“高投资回报率”的用户体验度量方法指南

本文核心就是介绍体验度量方法&#xff0c;以及如何在商业项目中如何发起一个具有高ROI(投资回报率)的用户体验量化流程。 下面文章将分为解读高投资回报和拆解体验度量、实际案例讲解三部分。一、解读高投资回报率高ROI(投资回报率)来定义体验度量流程的原因&#xff1f;3-5年…

md5 java代码_JAVA简单实现MD5注册登录加密实例代码

开发环境&#xff1a;jdk1.7&#xff0c;eclipse框架&#xff1a;springmvc&#xff0c;mybatis工具&#xff1a;maven以下代码复制即可实现MD5加密创建一个mave项目&#xff0c;加web。不懂得可以搜索一下就有了。注册用户的JSP页面代码如下。pageEncoding"utf-8"%&…

一维卷积神经网络_序列特征的处理方法之二:基于卷积神经网络方法

前言上一篇文章介绍了基本的基于注意力机制方法对序列特征的处理&#xff0c;这篇主要介绍一下基本的基于卷积神经网络方法对序列特征的处理&#xff0c;也就是TextCNN方法。序列特征的介绍&#xff0c;背景以及应用可以参考上一篇的详细介绍&#xff0c;这里简单回顾一下定义&…