關(guān)于hive中SQL的執(zhí)行原理解析
1. hive介紹
Hive 是一個基于 Hadoop 的數(shù)據(jù)倉庫工具,用于處理大規(guī)模的結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù)。Hive 的主要目的是提供一種類 SQL 的語言,稱為 HiveQL(或 HQL),以便用戶可以方便地處理數(shù)據(jù),無需編寫復(fù)雜的 MapReduce 任務(wù)。
Hive 的基本原理是將 SQL 查詢轉(zhuǎn)換為 MapReduce 任務(wù),然后在 Hadoop 上執(zhí)行這些任務(wù)以處理數(shù)據(jù)。Hive 基于 Hadoop 的 HDFS 存儲數(shù)據(jù),可以處理多種數(shù)據(jù)格式,例如 CSV、TSV、JSON 等,并支持用戶自定義函數(shù)(UDF)以進行更高級的數(shù)據(jù)處理。
Hive 通常用于大數(shù)據(jù)場景,例如數(shù)據(jù)分析、ETL(抽取、轉(zhuǎn)換和加載)以及商業(yè)智能等。Hive 還提供了豐富的工具和可視化界面,方便用戶管理和監(jiān)控數(shù)據(jù)倉庫。
2. hive的基本架構(gòu)
2.1 用戶接口:Client
CLI(command-line interface)、JDBC/ODBC。
說明:JDBC 和 ODBC 的區(qū)別:
(1)JDBC 的移植性比 ODBC 好;(通常情況下,安裝完 ODBC 驅(qū)動程序之后,還 需要經(jīng)過確定的配置才能夠應(yīng)用。而不相同的配置在不相同數(shù)據(jù)庫服務(wù)器之間不能夠通用。 所以,安裝一次就需要再配置一次。JDBC 只需要選取適當?shù)?JDBC 數(shù)據(jù)庫驅(qū)動程序,就 不需要額外的配置。在安裝過程中,JDBC 數(shù)據(jù)庫驅(qū)動程序會自己完成有關(guān)的配置。)
(2)兩者使用的語言不同,JDBC 在 Java 編程時使用,ODBC 一般在 C/C++編程 時使用
2.2 元數(shù)據(jù):Metastore
元數(shù)據(jù)包括:數(shù)據(jù)庫(默認是 default)、表名、表的擁有者、列/分區(qū)字段、表的類型 (是否是外部表)、表的數(shù)據(jù)所在目錄等。 默認存儲在自帶的 derby 數(shù)據(jù)庫中,由于 derby 數(shù)據(jù)庫只支持單客戶端訪問,生產(chǎn) 環(huán)境中為了多人開發(fā),推薦使用 MySQL 存儲 Metastore。
2.3 驅(qū)動器:Driver
- 解析器(SQLParser):將 SQL 字符串轉(zhuǎn)換成抽象語法樹(AST)
- 語義分析(Semantic Analyzer):將 AST 進一步劃分為 QeuryBlock
- 邏輯計劃生成器(Logical Plan Gen):將語法樹生成邏輯計劃
- 邏輯優(yōu)化器(Logical Optimizer):對邏輯計劃進行優(yōu)化
- 物理計劃生成器(Physical Plan Gen):根據(jù)優(yōu)化后的邏輯計劃生成物理計劃
- 物理優(yōu)化器(Physical Optimizer):對物理計劃進行優(yōu)化
- 執(zhí)行器(Execution):執(zhí)行該計劃,得到查詢結(jié)果并返回給客戶端
3. hive中sql關(guān)鍵字的執(zhí)行順序
在 Hive 中,查詢語句的執(zhí)行順序如下:
- FROM 子句:指定要從哪個表中檢索數(shù)據(jù);
- WHERE 子句:對數(shù)據(jù)進行篩選,只有滿足條件的數(shù)據(jù)才會被選中;
- GROUP BY 子句:按照指定的列對數(shù)據(jù)進行分組;
- HAVING 子句:對分組后的數(shù)據(jù)進行篩選,只有滿足條件的分組才會被選中;
- SELECT 子句:選擇要查詢的列;
- ORDER BY 子句:按照指定的列對結(jié)果進行排序;
- LIMIT 子句:限制返回結(jié)果的數(shù)量。
所以,查詢語句的執(zhí)行順序為:FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY -> LIMIT。
4. 部分關(guān)鍵字的執(zhí)行原理
4.1 聚合函數(shù)
- count(*),表示統(tǒng)計所有行數(shù),包含 null 值,與count(1)含義完全相同;
- count(某列),表示該列一共有多少行,不包含 null 值;
- max(),求最大值,不包含 null,除非所有值都是 null;
- min(),求最小值,不包含 null,除非所有值都是 null;
- sum(),求和,不包含 null;
- avg(),求平均值,不包含 null。
以count為例,每個map任務(wù)會對自己讀取的數(shù)據(jù)進行count操作,最后將所有map的count結(jié)果發(fā)送至reduce中進行總的count計算,完成表中count的計算(max、min、sum的原理和count一致)
avg的計算是每個map任務(wù)計算數(shù)據(jù)的sum與count,之后在reduce中進行匯總,計算sum/count的結(jié)果獲取平均值。
4.2 分組(group by )
Group By 語句通常會和聚合函數(shù)一起使用,按照一個或者多個列隊結(jié)果進行分組,然后對每個組執(zhí)行聚合操作。
每個map任務(wù)會對讀取的文件進行g(shù)roup by分組操作,然后進行組內(nèi)排序、求和、求最大最小值操作,最后到reduce進行匯總。
4.3 連接( join )
Hive 支持通常的 sql join 語句,但是只支持等值連接,不支持非等值連接
join會對輸入的數(shù)據(jù)字段進行分區(qū),key值為字段1,然后進入reduce進行匯總,輸出結(jié)果。
4.4 笛卡爾積
笛卡爾積一般出現(xiàn)在以下情況:
- 省略連接條件
- 連接條件無效
- 所有表中的所有行互相連接
例如:
--笛卡爾積的案例 select empno, dname from emp, dept;
hive sql的執(zhí)行過程如下:
4.5 聯(lián)合(union & union all)
union 和 union all 都是上下拼接 sql 的結(jié)果,這點是和 join 有區(qū)別的,join 是左右關(guān) 聯(lián),union 和 union all 是上下拼接。union 去重,union all 不去重。 union 和 union all 在上下拼接 sql 結(jié)果時有兩個要求:
(1)兩個 sql 的結(jié)果,列的個數(shù)必須相同
(2)兩個 sql 的結(jié)果,上下所對應(yīng)列的類型必須一致
select* from emp where deptno=10 union select* from emp where deptno=20;
4.6 排序
4.6.1 全局排序(Order By)
Order By:全局排序,只有一個 Reduce。
asc(ascend):升序(默認)
desc(descend):降序
每個map任務(wù)中的數(shù)據(jù)先進行排序,后再匯總到reduce進行排序。
4.6.2 全局排序每個 Reduce
內(nèi)部排序(Sort By)
Sort By:對于大規(guī)模的數(shù)據(jù)集 order by 的效率非常低。在很多情況下,并不需要全局排序,此時可以使用 Sort by。
Sort by 為每個 reduce 產(chǎn)生一個排序文件。每個 Reduce 內(nèi)部進行排序,對全局結(jié)果集來說不是排序。
--根據(jù)部門編號降序查看員工信息 select* from emp sort by deptno desc;
4.7 分區(qū)(Distribute By)
Distribute By:在有些情況下,我們需要控制某個特定行應(yīng)該到哪個 Reducer,通常是為了進行后續(xù)的聚集操作。
distribute by 子句可以做這件事。distribute by 類似 MapReduce 中 partition(自定義分區(qū)),進行分區(qū),結(jié)合 sort by 使用。 對于distribute by進行測試,一定要分配多 reduce 進行處理,否則無法看到 distribute by 的效果。
需要注意的地方:
- distribute by 的分區(qū)規(guī)則是根據(jù)分區(qū)字段的 hash 碼與 reduce 的個數(shù)進行相除后, 余數(shù)相同的分到一個區(qū)。
- Hive 要求 distribute by 語句要寫在 sort by 語句之前。
--先按照部門編號分區(qū),再按照員工編號薪資排序 select * from emp distribute by deptno sort by sal desc;
4.8 分區(qū)排序(Cluster By)
當 distribute by 和 sort by 字段相同時,可以使用 cluster by 方式。 cluster by 除了具有 distribute by 的功能外還兼具 sort by 的功能。但是排序只能是升序排序,不能指定排序規(guī)則為 asc 或者 desc。
--按照部門編號分組并排序 select* from emp cluster by deptno; --等價于 select* from emp distribute by deptno sort by deptno;
到此這篇關(guān)于關(guān)于hive中SQL的執(zhí)行原理解析的文章就介紹到這了,更多相關(guān)hive中的SQL原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
CentOS 8.2部署CouchDB 3.3數(shù)據(jù)庫的方法
這篇文章主要介紹了CentOS 8.2部署CouchDB 3.3數(shù)據(jù)庫,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12關(guān)于數(shù)據(jù)庫系統(tǒng)的概述
大家好,本篇文章主要講的是關(guān)于數(shù)據(jù)庫系統(tǒng)的概述,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12IntellJ Idea 2020版添加sqlite數(shù)據(jù)庫的方法
這篇文章主要介紹了IntellJ Idea 2020版添加sqlite數(shù)據(jù)庫的方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11Linux下開啟和配置OpenGauss數(shù)據(jù)庫遠程連接的教程詳解
openGauss是一款開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),采用木蘭寬松許可證v2發(fā)行,本文主要為大家介紹了Linux系統(tǒng)中如何開啟和配置OpenGauss數(shù)據(jù)庫的遠程連接,需要的小伙伴可以參考下2023-12-12