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.pswp.cn/news/533656.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533656.shtml
英文地址,請注明出處:http://en.pswp.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;其…

linux中如何復制文件并重命名_linux復制重命名 linux復制一個文件并重命名

linux下怎么復制一個文件到另外一個目錄并且重命名&#xff1f;使用Linux的CP命令復制一個文件&#xff0c;并指定一個新的文件名作為目標文件參數&#xff0c;實現復制文件時重命名文件的功能。例如&#xff0c;下面的命令將/root/fileaaa分配給/home目錄并將其重命名為filebb…

python程序員搞笑段子_程序員的爆笑漫畫和段子

Hi&#xff01;大家好呀&#xff01;我是你們幽默的喵哥&#xff01;每次推送&#xff0c;都是給大家推薦實用的項目或者技術&#xff0c;都比較枯燥。今天&#xff0c;喵哥就來給大家搞個有趣且幽默的。在程序員圈子中&#xff0c;我們也是有自己的職業文化的。比如&#xff0…

野火stm32呼吸燈程序_說一說STM32啟動過程

STM32上電后是怎么啟動的&#xff1f;main函數之前單片機都做了些什么&#xff1f;帶著這些疑問我們開始進入游戲。。。。。首先&#xff0c;開局一張圖&#xff0c;過程全靠編&#xff0c;如有說錯的地方望能指正啟動大致流程1- 上電啟動或者硬件復位2- 單片機從0x00地址開始執…

linuxpython升級3.5_linux升級python3.5到3.6

在ubuntu里&#xff0c;zlib叫zlib1g&#xff0c;相應的zlib-devel叫zlib1g.dev。默認的安裝源里沒有zlib1g.dev。要在packages.ubuntu.com上找。$sudo apt-get install ruby然后再裝zlib1g-dev就可以了$sudo apt-get install zlib1g-dev1. 安裝必備的軟件包centos: yum -y gro…

apache啟動失敗_請檢查相關配置.√mysql5.1已啟動._1、Apache啟動失敗,請檢查相關配置-百度經驗...

前幾天電腦系統崩潰了,后邊到服務中心重新恢復了系統,但是回來使用APMServ 5.2.6發現:1、Apache啟動失敗,請檢查相關配置。√MySQL5.1已啟動。系統的各種服務我都檢查過了,都是正常開啟的,百思不得其解,后邊在百度上搜索一篇文章有個例子照做了以后結果成功了。---------------…

職業規劃縱向橫向_收下這份《職業規劃喂飯式指南》

果不其然&#xff01;上篇文章發布后&#xff0c;我收到了被拿來舉反例的網友小哥的抗議~~~講道理&#xff0c;最后他拿到的Offer還是十分不錯的&#xff0c;從此以后我的朋友圈又多了一位第一手保真瓜主&#xff0c;他好我也好~那么本期《職業規劃喂飯式指南》來嘍&#xff01…

mysql通過集合查詢_MySQL使用集合函數進行查詢操作實例詳解

本文實例講述了MySQL使用集合函數進行查詢操作。分享給大家供大家參考&#xff0c;具體如下&#xff1a;COUNT函數SELECT COUNT(*) AS cust_num from customers;SELECT COUNT(c_email) AS email_num FROM customers;SELECT o_num, COUNT(f_id) FROM orderitems GROUP BY o_num;…

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;真正開始你的建站之旅。…

用python慶祝生日_python, 實現朋友家人年歷生日自動提醒

為了方便提醒自己&#xff0c;今天有哪位朋友過生日(年歷生日)。測試環境&#xff1a;fedora25桌面版。建立一個生日配置文件&#xff0c;注意&#xff1a;按日期排好序vi /etc/birthday.txt朋友A 1-4朋友C 2-3朋友B 3-8創建腳本文件創建腳本文件 /usr/bin/check_birthday&…

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;船長的…