【Spark】Spark Join類型及Join實現方式

Spark Join類型

在這里插入圖片描述

1. Inner Join (內連接)
  • 示例
    val result = df1.join(df2, df1("id") === df2("id"), "inner")
    
  • 執行邏輯:只返回那些在兩個表中都有匹配的行。
2. Left Join (左外連接)
  • 示例
    val result = df1.join(df2, df1("id") === df2("id"), "left")
    
  • 執行邏輯:返回左表的所有記錄,并且右表的匹配行,若右表沒有匹配行則返回 null
3. Right Join (右外連接)
  • 示例
    val result = df1.join(df2, df1("id") === df2("id"), "right")
    
  • 執行邏輯:返回右表的所有記錄,并且左表的匹配行,若左表沒有匹配行則返回 null
4. Full Join (全外連接)
  • 示例
    val result = df1.join(df2, df1("id") === df2("id"), "outer")
    
  • 執行邏輯:返回左表和右表的所有記錄,若某一方沒有匹配,另一方則填充 null
5. Left Semi Join (左半連接)
  • 示例
    val result = df1.join(df2, df1("id") === df2("id"), "left_semi")
    
  • 執行邏輯:返回左表中與右表匹配的行,只返回左表數據,不返回右表。
6. Left Anti Join (左反連接)
  • 示例
    val result = df1.join(df2, df1("id") === df2("id"), "left_anti")
    
  • 執行邏輯:返回左表中不與右表匹配的行。
7. Cross Join (笛卡爾積連接)
  • 示例
    val result = df1.crossJoin(df2)
    
  • 執行邏輯:返回兩表的笛卡爾積,左表的每一行與右表的每一行組合。

Spark Join實現方式

在 Spark 中,Join 操作有多種實現方式,每種方式的實現原理、適用場景和執行性能有所不同。接下來我們詳細討論以下幾種常見的
Join 實現方式:

在這里插入圖片描述

1. CPJ(Cartesion Product Join)笛卡爾積連接

工作原理:

  • 笛卡爾積連接是最基礎的連接方式,它將兩個數據集的每一條記錄與另一個數據集的每一條記錄進行配對,從而生成一個新的結果集。這個操作是非常低效的,因為它會產生
    N * M 條記錄(NM 分別是兩個數據集的行數)。
  • 這種方式不需要連接條件,因此通常不是我們期望的連接類型。

執行性能:

  • 效率低:當兩個數據集的大小很大時,計算量將急劇增加。通常,笛卡爾積連接僅在明確需要時使用(例如,計算所有可能的配對)。

Spark 選擇笛卡爾積的情況:

  • 笛卡爾積連接在 Spark 中通常是顯式調用 crossJoin() 時使用。
2. SMJ(Shuffle Sort Merge Join)排序歸并連接

工作原理:

  • 排序歸并連接首先對兩個數據集按照連接鍵進行排序,然后使用 merge 操作將排序后的數據集進行合并。數據集會被按連接鍵進行 shuffle,然后在每個分區內執行歸并操作。
  • 這種方法非常適合處理大規模的分布式數據,尤其是當兩個數據集都很大并且有良好的分區時。

執行性能:

  • 效率較高:適合大數據量的連接,尤其當連接鍵有排序特性時。
  • 由于需要對數據進行排序和 shuffle,這會增加網絡和磁盤的 I/O 成本。

Spark 選擇 SMJ 的情況:

  • 當數據集較大并且 Spark 能夠進行有效的 shuffle 操作時,Spark 會選擇 SMJ
  • 如果連接的表已經分區或有排序字段,則 Spark 會優先選擇該方式。
3. SHJ(Shuffle Hash Join)哈希連接

工作原理:

  • 哈希連接(SHJ) 是一種基于哈希表的連接方式。其基本思想是將一個表(通常是較小的表)哈希到內存中,然后通過哈希表查找另一個表的匹配記錄。該方法特別適合處理大規模的數據集,尤其是當連接的兩個數據集都比較大時,或者當連接鍵不具有順序或排序特性時。
  • 執行步驟
    1. 分區階段(Shuffle):首先,Spark 會將兩個數據集根據連接鍵進行 shuffle(重分區),確保具有相同連接鍵的記錄被發送到同一個節點。此時,數據會按照連接鍵進行重分區。
    2. 構建哈希表:選擇較小的表(通常是內表),在每個節點上對該表進行哈希,構建哈希表。哈希表存儲連接鍵及其對應的記錄。
    3. 匹配查找:然后,在同一個節點上掃描較大的表(外表),對于每一條記錄,使用相同的連接鍵查找哈希表中的匹配項。如果匹配,則生成結果。

執行性能:

  • 高效:相比傳統的嵌套循環連接(NLJ),哈希連接通常在處理大數據集時更為高效,特別是當連接條件是等值連接時。

Spark 選擇 SHJ 的情況:

  • 外表大小至少是內表的3倍且內表的數據分片平均大小要小于廣播變量閾值,Spark 會選擇 Shuffle Hash Join
4. BNLJ(Broadcast Nested Loop Join)廣播嵌套循環連接

工作原理:

  • 廣播嵌套循環連接是嵌套循環連接的一種優化形式,針對連接的一個表較小的情況。它首先將較小的表(通常是內表)廣播到所有執行節點,然后對大表(通常是外表)進行掃描。在每個節點上,將小表加載到內存中,并在每個分區上與外表進行連接。

執行性能:

  • 高效:相比于傳統的嵌套循環連接(Nested Loop Join),廣播嵌套循環連接的效率較高,因為它通過將小表廣播到每個節點,避免了全局的 shuffle 操作,減少了數據傳輸的延遲。
  • 適合當一個表非常小(例如,broadcast() 小表時)時,執行性能特別好。

Spark 選擇 BNLJ 的情況:

  • Spark 會自動選擇 Broadcast Nested Loop Join,當數據集中的一個表較小(可以放入內存)時,Spark 會選擇該表進行廣播,從而提高連接操作的性能。通常,Spark
    會根據表的大小和內存限制來決定是否使用廣播 join
5. BHJ(Broadcast Hash Join)廣播哈希連接

工作原理:

  • 廣播哈希連接通過將一個小表廣播到所有執行節點,從而避免了全局的 shuffle 操作。大的數據集會被分配到多個節點,而小的數據集會被廣播到每個節點。
  • 這種方式非常高效,適用于連接一個大表和一個小表的情況。

執行性能:

  • 效率非常高:適用于大表和小表連接,避免了大規模的 shuffle 操作。
  • 適合當一個表非常小(例如,broadcast() 小表時)時,執行性能特別好。

Spark 選擇 BHJ 的情況:

  • 如果其中一個表很小,Spark 會選擇 BHJ,因為將小表廣播到所有節點可以大大減少 shuffle 的開銷。
Spark 如何選擇 Join 策略?
1. 等值 Join

在等值數據關聯中,Spark 會嘗試按照以下順序選擇最優的連接策略:

  1. BHJ(Broadcast Hash Join)
  2. SMJ(Shuffle Sort Merge Join)
  3. SHJ(Shuffle Hash Join)

適用場景:

  • BHJ(Broadcast Hash Join): 連接類型不能是全連接(Full Outer Join),基表需要足夠小,能夠放入內存并通過廣播發送到所有節點。
  • SMJ(Shuffle Sort Merge Join)與 SHJ(Shuffle Hash Join):支持所有連接類型,如Full Outer Join,Anti join

為什么SHJ比SMJ執行效率高,排名卻不如SMJ靠前

  • 相比 SHJ,Spark優先選擇SMJ的原因在于,SMJ的實現方式更加穩定,更不容易OOM
  • 在 Spark 中,SHJ(Shuffle Hash Join) 策略要想被選中,需要滿足以下兩個先決條件:
    • a. 外表大小至少是內表的 3 倍:只有當內外表的尺寸懸殊到一定程度時,SHJ 的性能優勢才會明顯超過 SMJ。
    • b. 內表的數據分片平均大小要小于廣播變量閾值:內表的數據分片必須足夠小,以便能夠通過廣播傳遞到各個節點,而不引起內存溢出或性能問題。
  • 相比 SHJ,SMJ沒有這么多的附加條件,無論是單表排序,還是兩表做歸并關聯,都可以借助磁盤來完成。內存中放不下的數據,可以臨時溢出到磁盤
2. 非等值 Join
  • 在非等值數據關聯中,Spark可選的Join策略只有BNLJ(Broadcast Nested Loop Join)和CPJ(Cartesion Product Join),BNLJ適合內表滿足廣播情況,否則只能用CPJ兜底

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62547.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62547.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62547.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

socket UDP 環路回顯的服務端

基于socket通訊的方式&#xff0c;無論用http或者udp或者自定義的協議&#xff0c;程序結構都是類似的。這個以UDP協議為例簡要說明。 #include <stdio.h> // 標準輸入輸出庫 #include <sys/types.h> // 提供了一些數據類型&#xff0c;如ssize_t #include <sy…

Linux:network:添加ip的時候自動添加一個本地路由

文章目錄 問題問題 最近在看一個路由的問題,順便看內核代碼,發現在添加IP的時候,內核會自動添加一個local route。 net/ipv4/devinet.c inet_rtm_newaddr->__inet_insert_ifa /* Send message first, then call notifier.Notifier will trigger FIB update, so thatlis…

Magnet Player:一款基于Web的磁力鏈媒體播放器

Magnet Player&#xff1a;一款基于Web的磁力鏈媒體播放器 項目地址:https://gitcode.com/gh_mirrors/ma/magnet-player 是一個創新的開源項目&#xff0c;它允許用戶直接在瀏覽器中播放磁力鏈&#xff08;Magnet URI&#xff09;內容&#xff0c;無需下載或安裝任何桌面應用…

php:完整部署Grid++Report到php項目,并實現模板打印

一、下載Grid++Report軟件 路徑:開發者安裝包下載 - 銳浪報表工具 二、 安裝軟件 1、對下載的壓縮包運行內部的exe文件 2、選擇語言 3、 完成安裝引導 下一步即可 4、接收許可協議 點擊“我接受” 5、選擇安裝路徑 “瀏覽”選擇安裝路徑,點擊"安裝" 6、完成…

web安全攻防入門教程

Web安全攻防入門教程 Web安全攻防是指在Web應用程序的開發、部署和運行過程中&#xff0c;保護Web應用免受攻擊和惡意行為的技術與策略。這個領域不僅涉及防御措施的實現&#xff0c;還包括通過滲透測試、漏洞挖掘和模擬攻擊來識別潛在的安全問題。 本教程將帶你入門Web安全攻…

前端node環境安裝:nvm安裝詳細教程(安裝nvm、node、npm、cnpm、yarn及環境變量配置)

需求&#xff1a;在做前端開發的時候&#xff0c;有的時候 這個項目需要 node 14 那個項目需要 node 16&#xff0c;我們也不能卸載 安裝 。這豈不是很麻煩。這個時候 就需要 一個工具 來管理我們的 node 版本和 npm 版本。 下面就分享一個 nvm 工具 用來管理 node 版本。 這個…

Unity在運行狀態下,當物體Mesh網格發生變化時,如何讓MeshCollider碰撞體也隨之實時同步變化?

舊版源代碼地址&#xff1a;https://download.csdn.net/download/qq_41603955/90087225?spm1001.2014.3001.5501 舊版效果展示&#xff1a; 新版加上MeshCollider后的效果&#xff1a; 注意&#xff1a;在Unity中&#xff0c;當你動態地更改物體的Mesh時&#xff0c;通常期望…

OpenCV--特征匹配

OpenCV--特征匹配 代碼和筆記 代碼和筆記 import cv2 import numpy as np""" 特征匹配 """""" 暴力特征匹配&#xff1a;使用第一組&#xff08;第一幅圖&#xff09;中的一個特征描述子&#xff0c;使用一些距離計算與第二組中…

什么是自動化辦公

自動化辦公是指使用技術工具或軟件&#xff0c;通過預設流程或腳本&#xff0c;自動執行日常辦公任務&#xff0c;從而提升效率、減少錯誤、節約時間的辦公模式。它適用于需要重復性、規則明確的工作流程&#xff0c;讓員工將精力集中在更具創造性和戰略性的工作上。 自動化辦公…

常見排序算法總結 (四) - 快速排序與隨機選擇

快速排序 算法思想 每一輪在數組相應的范圍上隨機找一個元素進行劃分&#xff0c;將不大于它的所有元素都放到左邊&#xff0c;將大于它的元素都放到右邊。在左右兩個子數組上不斷地遞歸&#xff0c;直到整個數組上有序。 注意&#xff1a;實現時選擇的時參考荷蘭國旗問題優化…

unraid固態硬盤分區格式—默認1MiB對齊

背景 我的unraid中有三個機械硬盤和兩個固態硬盤&#xff0c;其中兩個固態硬盤組成zfs鏡像的cache&#xff0c;防止其中一個硬盤出問題導致數據丟失。然而&#xff0c;今天突然看到機械硬盤的分區格式為GPT 4k&#xff0c;而固態硬盤是MBR 1MiB。想到GPT更加優秀&#xff0c;并…

Flutter 圖片編輯板(一) 事件路由

一個圖片編輯板&#xff0c;有兩部分組成。編輯板和內容項。每一個內容項是被InteractiveViewer修飾的widget&#xff0c;具有縮放偏移的功能。 在圖片編輯板上&#xff0c; 會有多個內容相&#xff0c;圖片或文字&#xff08;添加文字目前還沒做過&#xff09;。 當要編輯其中…

數倉技術hive與oracle對比(一)

準備 包括軟硬件環境、數據、測試數據三方面的準備內容。 環境 虛擬機軟件virtualbox7&#xff0c;同樣的虛擬機配置&#xff1a;內存2G、cpu一核&#xff0c;物理主機同一臺macbookpro&#xff08;13-2020款&#xff09;&#xff0c;所以硬盤IO讀寫速度一致。 綜上&#x…

AR眼鏡_消費級工業AR智能眼鏡主板硬件解決方案

AR眼鏡的研發是一項復雜的軟硬件集成工程&#xff0c;它需要在攝影、音頻、交互和連接等多個方面提供卓越的基礎體驗&#xff0c;因此產品的每個細節都顯得尤為重要。 在設計AR眼鏡時&#xff0c;重量、體積和散熱性能都是必須認真考量的關鍵因素。在芯片平臺的選擇上&#xff…

通信原理概論復習筆記(1)

1 緒論 消息: 通信系統傳輸對象, 信息的載體和物理表現形式. 信息: 消息的有效內容和內涵. 信號: 消息的傳輸載體. 模擬通信: 信源 → \to → 調制器 → \to → 信道(噪聲) → \to → 解調器 → \to → 信宿. 數字通信: 信源 → \to → 信源編碼(壓縮數字化) → \to →…

ASPICE評估如何優化軟件開發、測試和部署流程

ASPICE&#xff08;Automotive SPICE&#xff0c;即汽車軟件過程改進及能力評定&#xff09;評估在提高軟件開發、測試、部署的速度和質量方面發揮著重要作用。以下是ASPICE評估如何具體提高這些環節的具體方式&#xff1a; 一、提高軟件開發效率 標準化流程&#xff1a;ASPIC…

【OpenCV】Canny邊緣檢測

理論 Canny 邊緣檢測是一種流行的邊緣檢測算法。它是由 John F. Canny 在 1986 年提出。 這是一個多階段算法&#xff0c;我們將介紹算法的每一個步驟。 降噪 由于邊緣檢測易受圖像中的噪聲影響&#xff0c;因此第一步是使用 5x5 高斯濾波器去除圖像中的噪聲。我們在前面的章…

Ubuntu 安裝 web 服務器

安裝 apach sudo apt install apache2 -y 查看 apach2 版本號 apache2 -v 檢查是否啟動服務器 sudo service apache2 status 檢查可用的 ufw 防火墻應用程序配置 sudo ufw app list 關閉防火墻 sudo ufw disable 更改允許通過端口流量 sudo ufw allow Apache Full 開啟…

如何落地文件即服務?--- 基于makeself封裝服務并啟動

我通常想能不能給客戶一個文件&#xff0c;然后客戶通過執行這個簡單的指令就可以吧&#xff0c;一個服務在本地起來&#xff1f; 這是一種文件即服務的思想&#xff0c;不知道你有沒有類似的想法&#xff0c;當我發現https://makeself.io/ &#xff0c;我覺得它能很好的解決我…

mysql集群MHA方式部署

1. 基本信息 部署機器角色部署路徑192.168.242.71MySQL-Mater MHA-NodeMySQL: /alidata1/mysql-5.7.43192.168.242.72MySQL-Slave MHA-NodeMHA-Node: /alidata1/admin/tools/mha4mysql-node-0.58192.168.242.73MySQL-Slave MHA-Node192.168.242.74MHA-ManagerMHA-Manager: …