色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Join在Spark中是如何組織運行的

人工智能與大數據技術 ? 來源:人工智能與大數據技術 ? 作者:人工智能與大數據 ? 2020-09-25 11:35 ? 次閱讀

Join作為SQL中一個重要語法特性,幾乎所有稍微復雜一點的數據分析場景都離不開Join,如今Spark SQL(Dataset/DataFrame)已經成為Spark應用程序開發的主流,作為開發者,我們有必要了解Join在Spark中是如何組織運行的。

SparkSQL總體流程介紹

在闡述Join實現之前,我們首先簡單介紹SparkSQL的總體流程,一般地,我們有兩種方式使用SparkSQL,一種是直接寫sql語句,這個需要有元數據庫支持,例如Hive等,另一種是通過Dataset/DataFrame編寫Spark應用程序。如下圖所示,sql語句被語法解析(SQL AST)成查詢計劃,或者我們通過Dataset/DataFrame提供的APIs組織成查詢計劃,查詢計劃分為兩大類:邏輯計劃和物理計劃,這個階段通常叫做邏輯計劃,經過語法分析(Analyzer)、一系列查詢優化(Optimizer)后得到優化后的邏輯計劃,最后被映射成物理計劃,轉換成RDD執行。

對于語法解析、語法分析以及查詢優化,本文不做詳細闡述,本文重點介紹Join的物理執行過程。

Join基本要素

如下圖所示,Join大致包括三個要素:Join方式、Join條件以及過濾條件。其中過濾條件也可以通過AND語句放在Join條件中。

Spark支持所有類型的Join,包括:

inner join

left outer join

right outer join

full outer join

left semi join

left anti join

下面分別闡述這幾種Join的實現。

Join基本實現流程

總體上來說,Join的基本實現流程如下圖所示,Spark將參與Join的兩張表抽象為流式遍歷表(streamIter)和查找表(buildIter),通常streamIter為大表,buildIter為小表,我們不用擔心哪個表為streamIter,哪個表為buildIter,這個spark會根據join語句自動幫我們完成。

在實際計算時,spark會基于streamIter來遍歷,每次取出streamIter中的一條記錄rowA,根據Join條件計算keyA,然后根據該keyA去buildIter中查找所有滿足Join條件(keyB==keyA)的記錄rowBs,并將rowBs中每條記錄分別與rowAjoin得到join后的記錄,最后根據過濾條件得到最終join的記錄。

從上述計算過程中不難發現,對于每條來自streamIter的記錄,都要去buildIter中查找匹配的記錄,所以buildIter一定要是查找性能較優的數據結構。spark提供了三種join實現:sort merge join、broadcast join以及hash join。

sort merge join實現

要讓兩條記錄能join到一起,首先需要將具有相同key的記錄在同一個分區,所以通常來說,需要做一次shuffle,map階段根據join條件確定每條記錄的key,基于該key做shuffle write,將可能join到一起的記錄分到同一個分區中,這樣在shuffle read階段就可以將兩個表中具有相同key的記錄拉到同一個分區處理。前面我們也提到,對于buildIter一定要是查找性能較優的數據結構,通常我們能想到hash表,但是對于一張較大的表來說,不可能將所有記錄全部放到hash表中,另外也可以對buildIter先排序,查找時按順序查找,查找代價也是可以接受的,我們知道,spark shuffle階段天然就支持排序,這個是非常好實現的,下面是sort merge join示意圖。

在shuffle read階段,分別對streamIter和buildIter進行merge sort,在遍歷streamIter時,對于每條記錄,都采用順序查找的方式從buildIter查找對應的記錄,由于兩個表都是排序的,每次處理完streamIter的一條記錄后,對于streamIter的下一條記錄,只需從buildIter中上一次查找結束的位置開始查找,所以說每次在buildIter中查找不必重頭開始,整體上來說,查找性能還是較優的。

broadcast join實現

為了能具有相同key的記錄分到同一個分區,我們通常是做shuffle,那么如果buildIter是一個非常小的表,那么其實就沒有必要大動干戈做shuffle了,直接將buildIter廣播到每個計算節點,然后將buildIter放到hash表中,如下圖所示。

從上圖可以看到,不用做shuffle,可以直接在一個map中完成,通常這種join也稱之為map join。那么問題來了,什么時候會用broadcast join實現呢?這個不用我們擔心,spark sql自動幫我們完成,當buildIter的估計大小不超過參數spark.sql.autoBroadcastJoinThreshold設定的值(默認10M),那么就會自動采用broadcast join,否則采用sort merge join。

hash join實現

除了上面兩種join實現方式外,spark還提供了hash join實現方式,在shuffle read階段不對記錄排序,反正來自兩格表的具有相同key的記錄會在同一個分區,只是在分區內不排序,將來自buildIter的記錄放到hash表中,以便查找,如下圖所示。

不難發現,要將來自buildIter的記錄放到hash表中,那么每個分區來自buildIter的記錄不能太大,否則就存不下,默認情況下hash join的實現是關閉狀態,如果要使用hash join,必須滿足以下四個條件:

buildIter總體估計大小超過spark.sql.autoBroadcastJoinThreshold設定的值,即不滿足broadcast join條件

開啟嘗試使用hash join的開關,spark.sql.join.preferSortMergeJoin=false

每個分區的平均大小不超過spark.sql.autoBroadcastJoinThreshold設定的值,即shuffle read階段每個分區來自buildIter的記錄要能放到內存中

streamIter的大小是buildIter三倍以上

所以說,使用hash join的條件其實是很苛刻的,在大多數實際場景中,即使能使用hash join,但是使用sort merge join也不會比hash join差很多,所以盡量使用hash

下面我們分別闡述不同Join方式的實現流程。

inner join

inner join是一定要找到左右表中滿足join條件的記錄,我們在寫sql語句或者使用DataFrame時,可以不用關心哪個是左表,哪個是右表,在spark sql查詢優化階段,spark會自動將大表設為左表,即streamIter,將小表設為右表,即buildIter。這樣對小表的查找相對更優。其基本實現流程如下圖所示,在查找階段,如果右表不存在滿足join條件的記錄,則跳過。

left outer join

left outer join是以左表為準,在右表中查找匹配的記錄,如果查找失敗,則返回一個所有字段都為null的記錄。我們在寫sql語句或者使用DataFrmae時,一般讓大表在左邊,小表在右邊。其基本實現流程如下圖所示。

right outer join

right outer join是以右表為準,在左表中查找匹配的記錄,如果查找失敗,則返回一個所有字段都為null的記錄。所以說,右表是streamIter,左表是buildIter,我們在寫sql語句或者使用DataFrame時,一般讓大表在右邊,小表在左邊。其基本實現流程如下圖所示。

full outer join

full outer join相對來說要復雜一點,總體上來看既要做left outer join,又要做right outer join,但是又不能簡單地先left outer join,再right outer join,最后union得到最終結果,因為這樣最終結果中就存在兩份inner join的結果了。因為既然完成left outer join又要完成right outer join,所以full outer join僅采用sort merge join實現,左邊和右表既要作為streamIter,又要作為buildIter,其基本實現流程如下圖所示。

由于左表和右表已經排好序,首先分別順序取出左表和右表中的一條記錄,比較key,如果key相等,則joinrowA和rowB,并將rowA和rowB分別更新到左表和右表的下一條記錄;如果keyAkeyB,則說明左表中沒有與右表rowB對應的記錄,那么joinnullRow與rowB,緊接著,rowB更新到右表的下一條記錄。如此循環遍歷直到左表和右表的記錄全部處理完。

left semi join

left semi join是以左表為準,在右表中查找匹配的記錄,如果查找成功,則僅返回左邊的記錄,否則返回null,其基本實現流程如下圖所示。

left anti join

left anti join與left semi join相反,是以左表為準,在右表中查找匹配的記錄,如果查找成功,則返回null,否則僅返回左邊的記錄,其基本實現流程如下圖所示。

總結

Join是數據庫查詢中一個非常重要的語法特性,在數據庫領域可以說是“得join者得天下”,SparkSQL作為一種分布式數據倉庫系統,給我們提供了全面的join支持,并在內部實現上無聲無息地做了很多優化,了解join的實現將有助于我們更深刻的了解我們的應用程序的運行軌跡。

責任編輯:xj

原文標題:面試必知的 Spark SQL 幾種 Join 實現

文章出處:【微信公眾號:人工智能與大數據技術】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • SQL
    SQL
    +關注

    關注

    1

    文章

    768

    瀏覽量

    44177
  • SPARK
    +關注

    關注

    1

    文章

    105

    瀏覽量

    19929

原文標題:面試必知的 Spark SQL 幾種 Join 實現

文章出處:【微信號:TheBigData1024,微信公眾號:人工智能與大數據技術】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    spark為什么比mapreduce快?

    spark為什么比mapreduce快? 首先澄清幾個誤區: 1:兩者都是基于內存計算的,任何計算框架都肯定是基于內存的,所以網上說的spark是基于內存計算所以快,顯然是錯誤的 2;DAG計算模型
    的頭像 發表于 09-06 09:45 ?292次閱讀

    spark運行的基本流程

    記錄和分享下spark運行的基本流程。 一、spark的基礎組件及其概念 1. ClusterManager Standalone模式
    的頭像 發表于 07-02 10:31 ?431次閱讀
    <b class='flag-5'>spark</b><b class='flag-5'>運行</b>的基本流程

    Spark基于DPU的Native引擎算子卸載方案

    ?和 R?等多種高級編程語言,這使得Spark可以應對各種復雜的大數據應用場景,例如金融、電商、社交媒體等。 Spark 經過多年發展,作為基礎的計算框架,不管是
    的頭像 發表于 06-28 17:12 ?716次閱讀
    <b class='flag-5'>Spark</b>基于DPU的Native引擎算子卸載方案

    關于Spark的從0實現30s內實時監控指標計算

    前言 說起Spark,大家就會自然而然地想到Flink,而且會不自覺地將這兩種主流的大數據實時處理技術進行比較。然后最終得出結論:Flink實時性大于Spark。 的確,Flink的數據計算
    的頭像 發表于 06-14 15:52 ?477次閱讀

    Spark+Hive”DPU環境下的性能測評 | OLAP數據庫引擎選型白皮書(24版)DPU部分節選

    奇點云2024年版《OLAP數據庫引擎選型白皮書》,中科馭數聯合奇點云針對Spark+Hive這類大數據計算場景下的主力引擎,測評DPU環境下對比CPU環境下的性能提升效果。特此節選該章節內容,與大家共享。
    的頭像 發表于 05-30 16:09 ?553次閱讀
    “<b class='flag-5'>Spark</b>+Hive”<b class='flag-5'>在</b>DPU環境下的性能測評 | OLAP數據庫引擎選型白皮書(24版)DPU部分節選

    移植Nucleo745ziq+cyw43439的wifi_join_wpa3時,得到Wifi_join 33555456錯誤信息如何解決?

    當我移植我的電路板(Nucleo745ziq+cyw43439)的 wifi_join_wpa3 時 但我得到的錯誤代碼是 33555456 OTL.... 如何解決我的項目?
    發表于 05-24 06:49

    STM8RAM運行遇到的疑問求解

    系統函數,而這個系統函數flash里面。這個時候我把flash 已經關了。程序就執行不動了。 RAM的地址域是from 0x0000 to 0x07FF flash的地址域是from 0x8000 to 0xFFFF RAM
    發表于 05-07 07:32

    淺談變電所運行平臺安全管理的應用

    淺談變電所運行平臺安全管理的應用 張穎姣 安科瑞電氣股份有限公司 上海嘉定 201801 摘要:電氣安全管理是企業生產管理中比較薄弱的環節,它是一項綜合性的工作,有工程技術的一面,也有組織
    的頭像 發表于 04-15 16:26 ?325次閱讀
    淺談變電所<b class='flag-5'>運行</b>平臺<b class='flag-5'>在</b>安全管理<b class='flag-5'>中</b>的應用

    stm32的運行程序,初始函數明明沒有while函數里面,為什么能反復運行

    stm32的運行程序,好多初始函數明明沒有while函數里面,但是,他卻能反復的,不斷地去運行,這是為什么呢? 就像是這個程序,對于設
    發表于 04-08 08:15

    如何利用DPU加速Spark大數據處理? | 總結篇

    SSD速度通過NVMe接口得到了大幅提升,并且網絡傳輸速率也進入了新的高度,但CPU主頻發展并未保持同等步調,3GHz左右的核心頻率已成為常態。 在當前背景下Apache Spark等大數據處理工具,盡管存儲和網絡性能的提升極大地減少了數據讀取和傳輸的時間消耗,但
    的頭像 發表于 04-02 13:45 ?1087次閱讀
    如何利用DPU加速<b class='flag-5'>Spark</b>大數據處理? | 總結篇

    STM32HIAR如何實現從FLASH加載到SRAM運行程序?

    如題,STM32H IAR如何實現從FLASH加載到SRAM運行程序 有沒有相關的例程可供參考
    發表于 03-28 07:46

    Spark基于DPU Snappy壓縮算法的異構加速方案

    Spark 某些工作負載方面表現得更加優越。換句話說,Spark 啟用了內存分布數據集,除了能夠提供交互式查詢外,它還可以優化迭代工作負載。Spark SQL是
    的頭像 發表于 03-26 17:06 ?840次閱讀
    <b class='flag-5'>Spark</b>基于DPU Snappy壓縮算法的異構加速方案

    RDMA技術Apache Spark的應用

    、電信、零售、醫療保健還是物聯網,Spark的應用幾乎遍及所有需要處理海量數據和復雜計算的領域。它的快速、易用和通用性,使得數據科學家和工程師能夠輕松實現數據挖掘、數據分析、實時處理等任務。 然而,Spark的燦爛光環背后,一
    的頭像 發表于 03-25 18:13 ?1560次閱讀
    RDMA技術<b class='flag-5'>在</b>Apache <b class='flag-5'>Spark</b><b class='flag-5'>中</b>的應用

    基于DPU和HADOS-RACE加速Spark 3.x

    、Python、Java、Scala、R)等特性大數據計算領域被廣泛使用。其中,Spark SQL 是 Spark 生態系統的一個重要組件,它允許用戶以結構化數據的方式進行數據處理
    的頭像 發表于 03-25 18:12 ?1396次閱讀
    基于DPU和HADOS-RACE加速<b class='flag-5'>Spark</b> 3.x

    淺談變電所運行平臺安全管理的應用

    電氣安全管理是企業生產管理中比較薄弱的環節,它是一項綜合性的工作,有工程技術的一面,也有組織管理的一面。詳細闡述了保障變電所安全運行的基本管理制度,著重探討了實踐中廣泛遇到的倒閘操作、電氣作業安全管理問題。
    的頭像 發表于 02-05 15:40 ?426次閱讀
    淺談變電所<b class='flag-5'>運行</b>平臺<b class='flag-5'>在</b>安全管理<b class='flag-5'>中</b>的應用
    主站蜘蛛池模板: 日本久久久久亚洲中字幕| 国产乱码免费卡1卡二卡3卡四卡| 浓毛BWBWBWBWBW日本| 俄罗斯女人Z0ZOZO| 亚洲色播永久网址大全| 全免费A敌肛交毛片免费懂色AV | 伊人久久精品AV无码一区| 日日操日日射| 美女胸网站| 精品四虎国产在免费观看| 戳女人屁股流水羞羞漫画| 91久久精品国产亚洲| 亚洲一在线| 性色香蕉AV久久久天天网| 人妻系列合集| 牛牛精品专区在线| 就操成人网| 久久国产精品免费网站| 国内精品乱码卡一卡2卡三卡| 国产69精品久久久熟女| MD传媒在线观看佳片| 最近中文字幕完整版免费| 亚洲色欲色欲WWW在线丝| 乡村教师电影完整版在线观看| 日韩伦理电影秋霞影院| 欧洲亚洲精品A片久久99果冻| 麻豆国产原创中文AV网站| 久久精品综合电影| 久久成人国产精品一区二区| 国产中文字幕一区| 国产欧美一区二区三区久久| 国产成人免费| 国产成人一区二区三中文| 嘟嘟嘟在线视频免费观看高清中文| jiapanese50欧美熟妇| JAPANBABES11学生老师| 99精品视频免费在线观看| 99视频一区| 北岛玲手机在线观看视频观看| WWW久久只有这里有精品| 白丝美女被狂躁免费漫画|