欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于hive中SQL的執(zhí)行原理解析

 更新時間:2023年07月05日 09:24:00   作者:柳小蔥  
這篇文章主要介紹了關(guān)于hive中SQL的執(zhí)行原理解析,Hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張表,并提供類SQL查詢功能,需要的朋友可以參考下

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

  1. 解析器(SQLParser):將 SQL 字符串轉(zhuǎn)換成抽象語法樹(AST)
  2. 語義分析(Semantic Analyzer):將 AST 進一步劃分為 QeuryBlock
  3. 邏輯計劃生成器(Logical Plan Gen):將語法樹生成邏輯計劃
  4. 邏輯優(yōu)化器(Logical Optimizer):對邏輯計劃進行優(yōu)化
  5. 物理計劃生成器(Physical Plan Gen):根據(jù)優(yōu)化后的邏輯計劃生成物理計劃
  6. 物理優(yōu)化器(Physical Optimizer):對物理計劃進行優(yōu)化
  7. 執(zhí)行器(Execution):執(zhí)行該計劃,得到查詢結(jié)果并返回給客戶端

3. hive中sql關(guān)鍵字的執(zhí)行順序

在 Hive 中,查詢語句的執(zhí)行順序如下:

  1. FROM 子句:指定要從哪個表中檢索數(shù)據(jù);
  2. WHERE 子句:對數(shù)據(jù)進行篩選,只有滿足條件的數(shù)據(jù)才會被選中;
  3. GROUP BY 子句:按照指定的列對數(shù)據(jù)進行分組;
  4. HAVING 子句:對分組后的數(shù)據(jù)進行篩選,只有滿足條件的分組才會被選中;
  5. SELECT 子句:選擇要查詢的列;
  6. ORDER BY 子句:按照指定的列對結(jié)果進行排序;
  7. 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)文章

最新評論