自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

【大數(shù)據(jù)】Hive Join 的原理與機(jī)制

大數(shù)據(jù) 數(shù)據(jù)分析
Map Join 通常用于一個很小的表和一個大表進(jìn)行 join 的場景,具體小表有多小,由參數(shù)hive.mapjoin.smalltable.filesize? 來決定,默認(rèn)值為 25M。滿足條件的話 Hive 在執(zhí)行時候會自動轉(zhuǎn)化為 MapJoin,或使用 hint 提示 /*+ mapjoin(table) */ 執(zhí)行 MapJoin。

一、概述

Hive是一個基于Hadoop的數(shù)據(jù)倉庫解決方案,它提供了類似于SQL的查詢語言,稱為HiveQL,用于處理結(jié)構(gòu)化數(shù)據(jù)。在Hive中,JOIN操作用于將兩個或多個表中的數(shù)據(jù)連接在一起,以便進(jìn)行聯(lián)合查詢和分析。

Hive 中 的 Join 可分為 Common Join(Reduce階段完成join)和 Map Join(Map 階段完成 join)。

Hive中的JOIN操作是通過MapReduce或Tez任務(wù)來執(zhí)行的,具體的執(zhí)行過程如下:

  1. 數(shù)據(jù)分片:Hive將參與JOIN操作的表按照指定的JOIN條件進(jìn)行分片。每個分片是表的一個子集,用于并行處理。
  2. Map階段:在Map階段,Hive會為每個分片創(chuàng)建一個Map任務(wù),并從輸入數(shù)據(jù)中提取JOIN條件所需要的鍵值對。對于每個鍵值對,Hive會將鍵發(fā)送到對應(yīng)的Reducer節(jié)點,并將值存儲在中間緩存中。
  3. Shuffle階段:在Shuffle階段,Hive將具有相同鍵的鍵值對發(fā)送到相同的Reducer節(jié)點。這個過程稱為數(shù)據(jù)洗牌,它確保具有相同鍵的數(shù)據(jù)被發(fā)送到同一個Reducer節(jié)點進(jìn)行處理。
  4. Reduce階段:在Reduce階段,Hive會為每個Reducer節(jié)點創(chuàng)建一個Reduce任務(wù)。每個Reduce任務(wù)接收來自不同Mapper節(jié)點的具有相同鍵的鍵值對,并執(zhí)行JOIN操作。在JOIN操作中,Hive會根據(jù)JOIN條件將具有相同鍵的記錄組合在一起,生成JOIN結(jié)果。

【注意】Hive中的JOIN操作是通過兩個或多個表的列進(jìn)行連接的。JOIN條件指定了哪些列用于匹配。Hive支持多種類型的JOIN,包括INNER JOIN(內(nèi)連接)、LEFT JOIN(左連接)、RIGHT JOIN(右連接)和FULL JOIN(全連接),可以根據(jù)需要選擇適當(dāng)?shù)腏OIN類型。

此外,Hive還提供了一些優(yōu)化技術(shù)來提高JOIN操作的性能,例如對表進(jìn)行分區(qū)和對中間結(jié)果進(jìn)行壓縮。這些技術(shù)可以減少數(shù)據(jù)移動和存儲開銷,加快JOIN操作的執(zhí)行速度。

【總結(jié)】Hive中的JOIN操作通過MapReduce或Tez任務(wù)進(jìn)行執(zhí)行,包括數(shù)據(jù)分片、Map階段、Shuffle階段和Reduce階段。它使用JOIN條件將具有相同鍵的記錄組合在一起,生成JOIN結(jié)果。通過選擇適當(dāng)?shù)腏OIN類型和使用優(yōu)化技術(shù),可以提高JOIN操作的性能。

二、環(huán)境準(zhǔn)備

如果已經(jīng)有了環(huán)境了,可以忽略,如果想快速部署環(huán)境可以參考我這篇文章:通過 docker-compose 快速部署 Hive 詳細(xì)教程

# 登錄容器
docker exec -it hive-hiveserver2 bash
# 連接hive
beeline -u jdbc:hive2://hive-hiveserver2:10000  -n hadoop

三、Hive JOIN 類型

Hive是一個基于Hadoop的數(shù)據(jù)倉庫工具,用于處理大規(guī)模數(shù)據(jù)集。在Hive中,JOIN是一種常用的操作,用于將兩個或多個表中的數(shù)據(jù)按照指定的條件進(jìn)行關(guān)聯(lián)。

圖片

Hive支持多種JOIN類型,包括:

  • 內(nèi)連接(inner join 或者簡寫成 join):只返回兩個表中匹配的行。內(nèi)連接基于一個或多個條件(通常是相等條件),匹配兩個表中的行,并將匹配的行返回為結(jié)果。只有滿足條件的行才會被包含在結(jié)果中。

示例:

SELECT *
FROM table1
JOIN table2
ON table1.id = table2.id;
  • 左外連接(left outer join 或者簡寫成 left join):返回左表中的所有行以及與右表匹配的行。如果右表中沒有匹配的行,則對應(yīng)的結(jié)果列將包含NULL值。

示例:

SELECT *
FROM table1
LEFT JOIN table2
ON table1.id = table2.id;
  • 右外連接(right outer join 或者簡寫成 right join):返回右表中的所有行以及與左表匹配的行。如果左表中沒有匹配的行,則對應(yīng)的結(jié)果列將包含NULL值。

示例:

SELECT *
FROM table1
RIGHT JOIN table2
ON table1.id = table2.id;
  • 全外連接(full outer join 或者簡寫成 full join):返回兩個表中的所有行,如果某一行在另一個表中沒有匹配,則對應(yīng)的結(jié)果列將包含NULL值。
SELECT *
FROM table1
FULL OUTER JOIN table2
ON table1.id = table2.id;

這些JOIN類型可以根據(jù)具體的業(yè)務(wù)需求選擇適當(dāng)?shù)念愋?。在Hive中,可以使用JOIN關(guān)鍵字來執(zhí)行JOIN操作,并指定要連接的表以及連接條件。例如,使用"INNER JOIN"、"LEFT OUTER JOIN"、"RIGHT OUTER JOIN"、"FULL OUTER JOIN"等來指定JOIN類型。

根據(jù)具體的需求和數(shù)據(jù)情況,你可以選擇不同的JOIN類型來滿足查詢需求。

四、Map,Shuffle,Reduce三階段

MapReduce的全套過程分為三個大階段,分別是Map、Shuffle和Reduce。結(jié)合多篇資料,我最終確定劃分11個小步驟來描述這個過程,在后續(xù)的內(nèi)容中我也會結(jié)合一部分源碼來進(jìn)行剖析。

圖片

1)Map 階段

在Map階段,原始數(shù)據(jù)被分割成多個大小相同的數(shù)據(jù)塊,每個數(shù)據(jù)塊被分配給一個Map任務(wù)處理。Map任務(wù)將輸入數(shù)據(jù)轉(zhuǎn)化為一系列鍵值對,其中鍵是進(jìn)行處理的對象,值是相關(guān)聯(lián)的數(shù)據(jù)。Map階段的輸出結(jié)果被保存在本地磁盤上,等待Shuffle階段的處理。

2)Shuffle階段

在Shuffle階段,Map任務(wù)的輸出結(jié)果根據(jù)鍵被分配到不同的Reduce任務(wù)進(jìn)行處理。這個過程稱為Shuffle過程。具體來說,每個Map任務(wù)會將其輸出結(jié)果按照鍵的哈希值分發(fā)到多個節(jié)點,每個節(jié)點對應(yīng)一個Reduce任務(wù)。在Shuffle過程中,數(shù)據(jù)通過網(wǎng)絡(luò)傳輸,需要考慮網(wǎng)絡(luò)帶寬和網(wǎng)絡(luò)延遲等因素,以確保數(shù)據(jù)能夠及時地到達(dá)目標(biāo)節(jié)點。

圖片

3)Reduce階段

在Reduce階段,每個Reduce任務(wù)將接收到的鍵值對根據(jù)鍵進(jìn)行聚合或者排序等操作,然后生成最終的輸出結(jié)果。同樣,在Reduce階段的輸出結(jié)果會被保存在本地磁盤上,最終匯總成最終的輸出結(jié)果。

【總結(jié)】可以看出,MapReduce框架中的三個階段都是分布式的,可以在多臺計算機(jī)上并行運(yùn)行。MapReduce框架能夠有效地處理大規(guī)模數(shù)據(jù),并實現(xiàn)高效的分布式計算。由于MapReduce框架的通用性和可伸縮性,因此已經(jīng)被廣泛應(yīng)用于各種數(shù)據(jù)處理和機(jī)器學(xué)習(xí)任務(wù)。

五、Common Join(Reduce階段)

在Hive中,常見連接(Common Join)在Reduce階段進(jìn)行。當(dāng)執(zhí)行常見連接時,Hive會首先對參與連接的表進(jìn)行Map階段的處理,將數(shù)據(jù)按照連接條件進(jìn)行分組和排序,并將它們發(fā)送到不同的Reduce任務(wù)中。

  • 在Reduce階段,每個Reduce任務(wù)會接收來自不同表的分組數(shù)據(jù),并執(zhí)行連接操作。具體而言,Reduce任務(wù)會對具有相同連接鍵的記錄進(jìn)行配對,從而實現(xiàn)連接操作。這通常涉及將具有相同連接鍵的記錄組合在一起,以生成最終的連接結(jié)果。
  • 在Reduce階段,Hive使用MapReduce框架來執(zhí)行常見連接操作。它通過將相同連接鍵的數(shù)據(jù)分發(fā)到相同的Reduce任務(wù)中,實現(xiàn)數(shù)據(jù)的匹配和連接。這種分布式計算的方式可以有效地處理大規(guī)模數(shù)據(jù)集,并實現(xiàn)高效的連接操作。

需要注意的是,由于常見連接操作在Reduce階段進(jìn)行,所以在執(zhí)行大規(guī)模連接操作時,可能會產(chǎn)生大量的中間數(shù)據(jù)和計算開銷。因此,優(yōu)化連接操作的性能是一個重要的考慮因素,可以通過調(diào)整Hive的配置參數(shù)、選擇適當(dāng)?shù)倪B接算法等方式來改善連接操作的性能。

以下面的HQL為例,圖解其過程:

SELECT a.id,a.dept,b.age
FROM a join b
ON (a.id = b.id);

圖片

六、Map Join(Map 階段)

Map Join 通常用于一個很小的表和一個大表進(jìn)行 join 的場景,具體小表有多小,由參數(shù)hive.mapjoin.smalltable.filesize 來決定,默認(rèn)值為 25M。滿足條件的話 Hive 在執(zhí)行時候會自動轉(zhuǎn)化為 MapJoin,或使用 hint 提示 /*+ mapjoin(table) */ 執(zhí)行 MapJoin。

圖片

如上圖中的流程:

  • 首先 Task A 在客戶端本地執(zhí)行,負(fù)責(zé)掃描小表 b 的數(shù)據(jù),將其轉(zhuǎn)換成一個HashTable 的數(shù)據(jù)結(jié)構(gòu),并寫入本地的文件中,之后將該文件加載到 DistributeCache 中。
  • 接下來的 Task B 任務(wù)是一個沒有 Reduce 的 MapReduce,啟動 MapTasks 掃描大表 a,在 Map 階段,根據(jù) a 的每一條記錄去和 DistributeCache 中 b 表對應(yīng)的 HashTable 關(guān)聯(lián),并直接輸出結(jié)果,因為沒有 Reduce,所以有多少個 Map Task,就有多少個結(jié)果文件。

【注意】Map JOIN 不適合 FULL/RIGHT OUTER JOIN。

責(zé)任編輯:武曉燕 來源: 大數(shù)據(jù)與云原生技術(shù)分享
相關(guān)推薦

2023-05-06 07:20:27

HiveDDL管理表

2017-12-22 17:43:58

司法大數(shù)據(jù)大數(shù)據(jù)法院

2009-09-04 10:37:50

Java堆棧溢出

2021-07-13 10:00:01

ThreadJoin方法

2015-11-16 11:17:30

PHP底層運(yùn)行機(jī)制原理

2023-07-10 09:42:45

分庫分表大數(shù)據(jù)

2013-01-07 10:09:56

大數(shù)據(jù)數(shù)據(jù)民主

2023-06-07 07:43:57

數(shù)據(jù)庫JOIN類型

2021-12-20 00:03:38

Webpack運(yùn)行機(jī)制

2013-05-16 10:16:23

2017-05-31 13:16:35

PHP運(yùn)行機(jī)制原理解析

2011-06-13 10:21:25

QT 信號 槽機(jī)制

2012-11-08 10:09:57

大數(shù)據(jù)HIVE

2016-10-12 18:58:15

大數(shù)據(jù)PIGHive

2010-06-07 13:30:15

2020-12-09 15:05:40

大數(shù)據(jù)學(xué)習(xí)Zookeeper

2021-06-10 19:10:32

大數(shù)據(jù)大數(shù)據(jù)應(yīng)用大數(shù)據(jù)技術(shù)

2021-09-06 07:28:31

大數(shù)據(jù) kerberos 認(rèn)證

2010-05-19 13:29:59

2011-07-18 14:08:08

點贊
收藏

51CTO技術(shù)棧公眾號