亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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。

說明:JDBC 和 ODBC 的區(qū)別:

(1)JDBC 的移植性比 ODBC 好;(通常情況下,安裝完 ODBC 驅(qū)動(dòng)程序之后,還 需要經(jīng)過確定的配置才能夠應(yīng)用。而不相同的配置在不相同數(shù)據(jù)庫(kù)服務(wù)器之間不能夠通用。 所以,安裝一次就需要再配置一次。JDBC 只需要選取適當(dāng)?shù)?JDBC 數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,就 不需要額外的配置。在安裝過程中,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ù)只支持單客戶端訪問,生產(chǎn) 環(huán)境中為了多人開發(fā),推薦使用 MySQL 存儲(chǔ) Metastore。

2.3 驅(qū)動(dòng)器:Driver

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

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

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

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

在這里插入圖片描述

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é)果集來說不是排序。

--根據(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)文章

  • 有效防止sql注入的方法演示

    有效防止sql注入的方法演示

    這篇文章主要給大家介紹了關(guān)于有效防止sql注入的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用sql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • CentOS 8.2部署CouchDB 3.3數(shù)據(jù)庫(kù)的方法

    CentOS 8.2部署CouchDB 3.3數(shù)據(jù)庫(kù)的方法

    這篇文章主要介紹了CentOS 8.2部署CouchDB 3.3數(shù)據(jù)庫(kù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 關(guān)于數(shù)據(jù)庫(kù)系統(tǒng)的概述

    關(guān)于數(shù)據(jù)庫(kù)系統(tǒng)的概述

    大家好,本篇文章主要講的是關(guān)于數(shù)據(jù)庫(kù)系統(tǒng)的概述,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • IntellJ Idea 2020版添加sqlite數(shù)據(jù)庫(kù)的方法

    IntellJ Idea 2020版添加sqlite數(shù)據(jù)庫(kù)的方法

    這篇文章主要介紹了IntellJ Idea 2020版添加sqlite數(shù)據(jù)庫(kù)的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • MSSQL內(nèi)連接inner join查詢方法

    MSSQL內(nèi)連接inner join查詢方法

    sql內(nèi)連接查詢代碼,實(shí)例分析inner join實(shí)現(xiàn)方法
    2008-04-04
  • Linux下開啟和配置OpenGauss數(shù)據(jù)庫(kù)遠(yuǎn)程連接的教程詳解

    Linux下開啟和配置OpenGauss數(shù)據(jù)庫(kù)遠(yuǎn)程連接的教程詳解

    openGauss是一款開源關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),采用木蘭寬松許可證v2發(fā)行,本文主要為大家介紹了Linux系統(tǒng)中如何開啟和配置OpenGauss數(shù)據(jù)庫(kù)的遠(yuǎn)程連接,需要的小伙伴可以參考下
    2023-12-12
  • 恢復(fù) SQL 被注入后的數(shù)據(jù)代碼

    恢復(fù) SQL 被注入后的數(shù)據(jù)代碼

    當(dāng)數(shù)據(jù)庫(kù)別批量注入掛馬后,需要批量替換掉,可以參考下面的代碼。
    2009-02-02
  • 一個(gè)提升PostgreSQL性能的小技巧

    一個(gè)提升PostgreSQL性能的小技巧

    這篇文章主要介紹了一個(gè)提升Postgres性能的小技巧,通過修改很少的代碼來優(yōu)化查詢,需要的朋友可以參考下
    2015-04-04
  • Sql語(yǔ)句求最小可用id

    Sql語(yǔ)句求最小可用id

    Sql語(yǔ)句求最小可用id...
    2007-04-04
  • Dbeaver基本使用圖文詳解

    Dbeaver基本使用圖文詳解

    dbeaver是一款很強(qiáng)大的數(shù)據(jù)庫(kù)連接工具,本人之前使用的是navicat,挺好用的,只不過每次激活都要整半天,然后看到了dbeaver這款工具,本著嘗試的心態(tài),體驗(yàn)了下,真香
    2021-11-11

最新評(píng)論