關(guān)于hive中SQL的執(zhí)行原理解析
1. hive介紹
Hive 是一個(gè)基于 Hadoop 的數(shù)據(jù)倉(cāng)庫(kù)工具,用于處理大規(guī)模的結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù)。Hive 的主要目的是提供一種類 SQL 的語(yǔ)言,稱為 HiveQL(或 HQL),以便用戶可以方便地處理數(shù)據(jù),無(wú)需編寫復(fù)雜的 MapReduce 任務(wù)。
Hive 的基本原理是將 SQL 查詢轉(zhuǎn)換為 MapReduce 任務(wù),然后在 Hadoop 上執(zhí)行這些任務(wù)以處理數(shù)據(jù)。Hive 基于 Hadoop 的 HDFS 存儲(chǔ)數(shù)據(jù),可以處理多種數(shù)據(jù)格式,例如 CSV、TSV、JSON 等,并支持用戶自定義函數(shù)(UDF)以進(jìn)行更高級(jí)的數(shù)據(jù)處理。
Hive 通常用于大數(shù)據(jù)場(chǎng)景,例如數(shù)據(jù)分析、ETL(抽取、轉(zhuǎn)換和加載)以及商業(yè)智能等。Hive 還提供了豐富的工具和可視化界面,方便用戶管理和監(jiān)控?cái)?shù)據(jù)倉(cāng)庫(kù)。
2. hive的基本架構(gòu)
2.1 用戶接口:Client
CLI(command-line interface)、JDBC/ODBC。
說(shuō)明:JDBC 和 ODBC 的區(qū)別:
(1)JDBC 的移植性比 ODBC 好;(通常情況下,安裝完 ODBC 驅(qū)動(dòng)程序之后,還 需要經(jīng)過(guò)確定的配置才能夠應(yīng)用。而不相同的配置在不相同數(shù)據(jù)庫(kù)服務(wù)器之間不能夠通用。 所以,安裝一次就需要再配置一次。JDBC 只需要選取適當(dāng)?shù)?JDBC 數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,就 不需要額外的配置。在安裝過(guò)程中,JDBC 數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序會(huì)自己完成有關(guān)的配置。)
(2)兩者使用的語(yǔ)言不同,JDBC 在 Java 編程時(shí)使用,ODBC 一般在 C/C++編程 時(shí)使用
2.2 元數(shù)據(jù):Metastore
元數(shù)據(jù)包括:數(shù)據(jù)庫(kù)(默認(rèn)是 default)、表名、表的擁有者、列/分區(qū)字段、表的類型 (是否是外部表)、表的數(shù)據(jù)所在目錄等。 默認(rèn)存儲(chǔ)在自帶的 derby 數(shù)據(jù)庫(kù)中,由于 derby 數(shù)據(jù)庫(kù)只支持單客戶端訪問(wèn),生產(chǎn) 環(huán)境中為了多人開(kāi)發(fā),推薦使用 MySQL 存儲(chǔ) Metastore。
2.3 驅(qū)動(dòng)器:Driver
- 解析器(SQLParser):將 SQL 字符串轉(zhuǎn)換成抽象語(yǔ)法樹(shù)(AST)
- 語(yǔ)義分析(Semantic Analyzer):將 AST 進(jìn)一步劃分為 QeuryBlock
- 邏輯計(jì)劃生成器(Logical Plan Gen):將語(yǔ)法樹(shù)生成邏輯計(jì)劃
- 邏輯優(yōu)化器(Logical Optimizer):對(duì)邏輯計(jì)劃進(jìn)行優(yōu)化
- 物理計(jì)劃生成器(Physical Plan Gen):根據(jù)優(yōu)化后的邏輯計(jì)劃生成物理計(jì)劃
- 物理優(yōu)化器(Physical Optimizer):對(duì)物理計(jì)劃進(jìn)行優(yōu)化
- 執(zhí)行器(Execution):執(zhí)行該計(jì)劃,得到查詢結(jié)果并返回給客戶端
3. hive中sql關(guān)鍵字的執(zhí)行順序
在 Hive 中,查詢語(yǔ)句的執(zhí)行順序如下:
- FROM 子句:指定要從哪個(gè)表中檢索數(shù)據(jù);
- WHERE 子句:對(duì)數(shù)據(jù)進(jìn)行篩選,只有滿足條件的數(shù)據(jù)才會(huì)被選中;
- GROUP BY 子句:按照指定的列對(duì)數(shù)據(jù)進(jìn)行分組;
- HAVING 子句:對(duì)分組后的數(shù)據(jù)進(jìn)行篩選,只有滿足條件的分組才會(huì)被選中;
- SELECT 子句:選擇要查詢的列;
- ORDER BY 子句:按照指定的列對(duì)結(jié)果進(jìn)行排序;
- LIMIT 子句:限制返回結(jié)果的數(shù)量。
所以,查詢語(yǔ)句的執(zhí)行順序?yàn)椋篎ROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY -> LIMIT。
4. 部分關(guān)鍵字的執(zhí)行原理
4.1 聚合函數(shù)
- count(*),表示統(tǒng)計(jì)所有行數(shù),包含 null 值,與count(1)含義完全相同;
- count(某列),表示該列一共有多少行,不包含 null 值;
- max(),求最大值,不包含 null,除非所有值都是 null;
- min(),求最小值,不包含 null,除非所有值都是 null;
- sum(),求和,不包含 null;
- avg(),求平均值,不包含 null。
以count為例,每個(gè)map任務(wù)會(huì)對(duì)自己讀取的數(shù)據(jù)進(jìn)行count操作,最后將所有map的count結(jié)果發(fā)送至reduce中進(jìn)行總的count計(jì)算,完成表中count的計(jì)算(max、min、sum的原理和count一致)

avg的計(jì)算是每個(gè)map任務(wù)計(jì)算數(shù)據(jù)的sum與count,之后在reduce中進(jìn)行匯總,計(jì)算sum/count的結(jié)果獲取平均值。

4.2 分組(group by )
Group By 語(yǔ)句通常會(huì)和聚合函數(shù)一起使用,按照一個(gè)或者多個(gè)列隊(duì)結(jié)果進(jìn)行分組,然后對(duì)每個(gè)組執(zhí)行聚合操作。
每個(gè)map任務(wù)會(huì)對(duì)讀取的文件進(jìn)行g(shù)roup by分組操作,然后進(jìn)行組內(nèi)排序、求和、求最大最小值操作,最后到reduce進(jìn)行匯總。

4.3 連接( join )
Hive 支持通常的 sql join 語(yǔ)句,但是只支持等值連接,不支持非等值連接
join會(huì)對(duì)輸入的數(shù)據(jù)字段進(jìn)行分區(qū),key值為字段1,然后進(jìn)入reduce進(jìn)行匯總,輸出結(jié)果。

4.4 笛卡爾積
笛卡爾積一般出現(xiàn)在以下情況:
- 省略連接條件
- 連接條件無(wú)效
- 所有表中的所有行互相連接
例如:
--笛卡爾積的案例 select empno, dname from emp, dept;
hive sql的執(zhí)行過(guò)程如下:

4.5 聯(lián)合(union & union all)
union 和 union all 都是上下拼接 sql 的結(jié)果,這點(diǎn)是和 join 有區(qū)別的,join 是左右關(guān) 聯(lián),union 和 union all 是上下拼接。union 去重,union all 不去重。 union 和 union all 在上下拼接 sql 結(jié)果時(shí)有兩個(gè)要求:
(1)兩個(gè) sql 的結(jié)果,列的個(gè)數(shù)必須相同
(2)兩個(gè) sql 的結(jié)果,上下所對(duì)應(yīng)列的類型必須一致
select* from emp where deptno=10 union select* from emp where deptno=20;
4.6 排序
4.6.1 全局排序(Order By)
Order By:全局排序,只有一個(gè) Reduce。
asc(ascend):升序(默認(rèn))
desc(descend):降序
每個(gè)map任務(wù)中的數(shù)據(jù)先進(jìn)行排序,后再匯總到reduce進(jìn)行排序。

4.6.2 全局排序每個(gè) Reduce
內(nèi)部排序(Sort By)
Sort By:對(duì)于大規(guī)模的數(shù)據(jù)集 order by 的效率非常低。在很多情況下,并不需要全局排序,此時(shí)可以使用 Sort by。
Sort by 為每個(gè) reduce 產(chǎn)生一個(gè)排序文件。每個(gè) Reduce 內(nèi)部進(jìn)行排序,對(duì)全局結(jié)果集來(lái)說(shuō)不是排序。
--根據(jù)部門編號(hào)降序查看員工信息 select* from emp sort by deptno desc;

4.7 分區(qū)(Distribute By)
Distribute By:在有些情況下,我們需要控制某個(gè)特定行應(yīng)該到哪個(gè) Reducer,通常是為了進(jìn)行后續(xù)的聚集操作。
distribute by 子句可以做這件事。distribute by 類似 MapReduce 中 partition(自定義分區(qū)),進(jìn)行分區(qū),結(jié)合 sort by 使用。 對(duì)于distribute by進(jìn)行測(cè)試,一定要分配多 reduce 進(jìn)行處理,否則無(wú)法看到 distribute by 的效果。
需要注意的地方:
- distribute by 的分區(qū)規(guī)則是根據(jù)分區(qū)字段的 hash 碼與 reduce 的個(gè)數(shù)進(jìn)行相除后, 余數(shù)相同的分到一個(gè)區(qū)。
- Hive 要求 distribute by 語(yǔ)句要寫在 sort by 語(yǔ)句之前。
--先按照部門編號(hào)分區(qū),再按照員工編號(hào)薪資排序 select * from emp distribute by deptno sort by sal desc;

4.8 分區(qū)排序(Cluster By)
當(dāng) distribute by 和 sort by 字段相同時(shí),可以使用 cluster by 方式。 cluster by 除了具有 distribute by 的功能外還兼具 sort by 的功能。但是排序只能是升序排序,不能指定排序規(guī)則為 asc 或者 desc。
--按照部門編號(hào)分組并排序 select* from emp cluster by deptno; --等價(jià)于 select* from emp distribute by deptno sort by deptno;

到此這篇關(guān)于關(guān)于hive中SQL的執(zhí)行原理解析的文章就介紹到這了,更多相關(guān)hive中的SQL原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Navicat工具比對(duì)兩個(gè)數(shù)據(jù)庫(kù)所有表結(jié)構(gòu)的差異案例詳解
這篇文章主要介紹了如何使用Navicat工具對(duì)比兩個(gè)數(shù)據(jù)庫(kù)test_old和test_new,并生成相應(yīng)的DDL?SQL語(yǔ)句,以便將test_old升級(jí)到和test_new一致的狀態(tài),需要的朋友可以參考下2025-02-02
關(guān)于Navicat連接MySql數(shù)據(jù)庫(kù)慢的問(wèn)題
這篇文章主要介紹了關(guān)于Navicat連接MySql數(shù)據(jù)庫(kù)慢的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
TDSQL 安裝部署附圖的實(shí)現(xiàn)(圖文)
這篇文章主要介紹了TDSQL 安裝部署附圖的實(shí)現(xiàn)(圖文),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
SQL中NTEXT字段內(nèi)容顯示<long text>的原因
SQL中NTEXT字段內(nèi)容顯示<long text>的原因...2007-03-03
JDBC大批量寫入數(shù)據(jù)到SQLServer2000,記錄數(shù)大于10000
JDBC大批量寫入數(shù)據(jù)到SQLServer2000,記錄數(shù)大于100002009-12-12
數(shù)據(jù)庫(kù)測(cè)試 實(shí)用技巧及測(cè)試方法
軟件應(yīng)用程序已經(jīng)離不開(kāi)數(shù)據(jù)庫(kù)。無(wú)論是在Web、桌面應(yīng)用、客戶端服務(wù)器、企業(yè)和個(gè)人業(yè)務(wù),都需要數(shù)據(jù)庫(kù)在后端操作。2011-07-07

