日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Join在Spark中是如何組織運(yùn)行的

人工智能與大數(shù)據(jù)技術(shù) ? 來源:人工智能與大數(shù)據(jù)技術(shù) ? 作者:人工智能與大數(shù)據(jù) ? 2020-09-25 11:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

SparkSQL總體流程介紹

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

對(duì)于語法解析、語法分析以及查詢優(yōu)化,本文不做詳細(xì)闡述,本文重點(diǎn)介紹Join的物理執(zhí)行過程。

Join基本要素

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

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

inner join

left outer join

right outer join

full outer join

left semi join

left anti join

下面分別闡述這幾種Join的實(shí)現(xiàn)。

Join基本實(shí)現(xiàn)流程

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

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

從上述計(jì)算過程中不難發(fā)現(xiàn),對(duì)于每條來自streamIter的記錄,都要去buildIter中查找匹配的記錄,所以buildIter一定要是查找性能較優(yōu)的數(shù)據(jù)結(jié)構(gòu)。spark提供了三種join實(shí)現(xiàn):sort merge join、broadcast join以及hash join。

sort merge join實(shí)現(xiàn)

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

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

broadcast join實(shí)現(xiàn)

為了能具有相同key的記錄分到同一個(gè)分區(qū),我們通常是做shuffle,那么如果buildIter是一個(gè)非常小的表,那么其實(shí)就沒有必要大動(dòng)干戈做shuffle了,直接將buildIter廣播到每個(gè)計(jì)算節(jié)點(diǎn),然后將buildIter放到hash表中,如下圖所示。

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

hash join實(shí)現(xiàn)

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

不難發(fā)現(xiàn),要將來自buildIter的記錄放到hash表中,那么每個(gè)分區(qū)來自buildIter的記錄不能太大,否則就存不下,默認(rèn)情況下hash join的實(shí)現(xiàn)是關(guān)閉狀態(tài),如果要使用hash join,必須滿足以下四個(gè)條件:

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

開啟嘗試使用hash join的開關(guān),spark.sql.join.preferSortMergeJoin=false

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

streamIter的大小是buildIter三倍以上

所以說,使用hash join的條件其實(shí)是很苛刻的,在大多數(shù)實(shí)際場(chǎng)景中,即使能使用hash join,但是使用sort merge join也不會(huì)比hash join差很多,所以盡量使用hash

下面我們分別闡述不同Join方式的實(shí)現(xiàn)流程。

inner join

inner join是一定要找到左右表中滿足join條件的記錄,我們?cè)趯憇ql語句或者使用DataFrame時(shí),可以不用關(guān)心哪個(gè)是左表,哪個(gè)是右表,在spark sql查詢優(yōu)化階段,spark會(huì)自動(dòng)將大表設(shè)為左表,即streamIter,將小表設(shè)為右表,即buildIter。這樣對(duì)小表的查找相對(duì)更優(yōu)。其基本實(shí)現(xiàn)流程如下圖所示,在查找階段,如果右表不存在滿足join條件的記錄,則跳過。

left outer join

left outer join是以左表為準(zhǔn),在右表中查找匹配的記錄,如果查找失敗,則返回一個(gè)所有字段都為null的記錄。我們?cè)趯憇ql語句或者使用DataFrmae時(shí),一般讓大表在左邊,小表在右邊。其基本實(shí)現(xiàn)流程如下圖所示。

right outer join

right outer join是以右表為準(zhǔn),在左表中查找匹配的記錄,如果查找失敗,則返回一個(gè)所有字段都為null的記錄。所以說,右表是streamIter,左表是buildIter,我們?cè)趯憇ql語句或者使用DataFrame時(shí),一般讓大表在右邊,小表在左邊。其基本實(shí)現(xiàn)流程如下圖所示。

full outer join

full outer join相對(duì)來說要復(fù)雜一點(diǎn),總體上來看既要做left outer join,又要做right outer join,但是又不能簡(jiǎn)單地先left outer join,再right outer join,最后union得到最終結(jié)果,因?yàn)檫@樣最終結(jié)果中就存在兩份inner join的結(jié)果了。因?yàn)榧热煌瓿蒷eft outer join又要完成right outer join,所以full outer join僅采用sort merge join實(shí)現(xiàn),左邊和右表既要作為streamIter,又要作為buildIter,其基本實(shí)現(xiàn)流程如下圖所示。

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

left semi join

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

left anti join

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

總結(jié)

Join是數(shù)據(jù)庫(kù)查詢中一個(gè)非常重要的語法特性,在數(shù)據(jù)庫(kù)領(lǐng)域可以說是“得join者得天下”,SparkSQL作為一種分布式數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng),給我們提供了全面的join支持,并在內(nèi)部實(shí)現(xiàn)上無聲無息地做了很多優(yōu)化,了解join的實(shí)現(xiàn)將有助于我們更深刻的了解我們的應(yīng)用程序的運(yùn)行軌跡。

責(zé)任編輯:xj

原文標(biāo)題:面試必知的 Spark SQL 幾種 Join 實(shí)現(xiàn)

文章出處:【微信公眾號(hào):人工智能與大數(shù)據(jù)技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    807

    瀏覽量

    46964
  • SPARK
    +關(guān)注

    關(guān)注

    1

    文章

    108

    瀏覽量

    21292

原文標(biāo)題:面試必知的 Spark SQL 幾種 Join 實(shí)現(xiàn)

文章出處:【微信號(hào):TheBigData1024,微信公眾號(hào):人工智能與大數(shù)據(jù)技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    恩智浦LPC55S36平臺(tái)上如何處理I3C協(xié)議的Hot-Join事件

    更豐富的功能特性,如動(dòng)態(tài)地址分配、In-Band Interrupt(IBI)、Hot-Join、節(jié)能模式等。
    的頭像 發(fā)表于 04-27 16:12 ?186次閱讀
    <b class='flag-5'>在</b>恩智浦LPC55S36平臺(tái)上如何處理I3C協(xié)議<b class='flag-5'>中</b>的Hot-<b class='flag-5'>Join</b>事件

    Keil Studio現(xiàn)已支持GitHub Codespaces運(yùn)行

    Keil Studio 現(xiàn)已支持 GitHub Codespaces 運(yùn)行,通過你的瀏覽器即可將 Arm 量產(chǎn)級(jí)、兼容 CMSIS 的開發(fā)工作流,融入全托管、容器化的云端工作空間。數(shù)秒內(nèi)即可搭建純凈且可復(fù)用的開發(fā)環(huán)境,讓構(gòu)建
    的頭像 發(fā)表于 04-21 14:38 ?309次閱讀
    Keil Studio現(xiàn)已支持<b class='flag-5'>在</b>GitHub Codespaces<b class='flag-5'>中</b><b class='flag-5'>運(yùn)行</b>

    基于Arm架構(gòu)的NVIDIA DGX Spark平臺(tái)構(gòu)建離線語音助手系統(tǒng)

    基于云的人工智能 (AI) 占據(jù)了大多數(shù)關(guān)注焦點(diǎn),但真正實(shí)現(xiàn)響應(yīng)和隱私保護(hù)的交互則發(fā)生在邊緣側(cè)。本文將展示如何基于 Arm 架構(gòu)的 NVIDIA DGX Spark 平臺(tái),構(gòu)建一個(gè)完全離線、實(shí)時(shí)運(yùn)行
    的頭像 發(fā)表于 04-09 15:51 ?266次閱讀
    基于Arm架構(gòu)的NVIDIA DGX <b class='flag-5'>Spark</b>平臺(tái)構(gòu)建離線語音助手系統(tǒng)

    后量化模型 iMX93 NPU 上運(yùn)行,但輸出不正確怎么解決

    我正在使用 MobileNet 的自定義實(shí)現(xiàn),旨在對(duì) spark 進(jìn)行二進(jìn)制分類。轉(zhuǎn)換為 tflite 并將其量化為 int8 后,模型按預(yù)期 NPU 上運(yùn)行,但輸出沒有意義。該模型
    發(fā)表于 03-18 07:53

    首屆中國(guó)NVIDIA DGX Spark黑客松大賽開啟報(bào)名

    倒計(jì)時(shí)啟動(dòng)!首屆中國(guó) NVIDIA DGX Spark 黑客松(Hackathon)將于 3 月 13 日 - 3 月 28 日正式開啟報(bào)名!本屆賽事以“算力破局、AI 落地”為核心導(dǎo)向,依托
    的頭像 發(fā)表于 03-14 16:39 ?2751次閱讀

    NVIDIA DGX Spark助力高等教育領(lǐng)域重大項(xiàng)目

    全球各地的頂尖高校,NVIDIA DGX Spark 桌面超級(jí)計(jì)算機(jī)正將數(shù)據(jù)中心級(jí)的 AI 能力帶到實(shí)驗(yàn)室臺(tái)前、教師辦公室里和學(xué)生的終端設(shè)備上。地球最南端的南極,也有一臺(tái) DGX Spar
    的頭像 發(fā)表于 03-09 16:33 ?713次閱讀

    如何在DGX Spark運(yùn)行NVIDIA Omniverse

    首先感謝 Vigor 同學(xué)第一時(shí)間的分享,以下是具體如何在 DGX Spark運(yùn)行 Omniverse 的方法。
    的頭像 發(fā)表于 12-17 10:13 ?968次閱讀
    如何在DGX <b class='flag-5'>Spark</b>上<b class='flag-5'>運(yùn)行</b>NVIDIA Omniverse

    耐能攜手Spark迪維科推動(dòng)AI技術(shù)垂直產(chǎn)業(yè)的應(yīng)用發(fā)展

    全球領(lǐng)先的邊緣 AI 芯片領(lǐng)域先行者Kneron耐能宣布與AI影像科技領(lǐng)導(dǎo)品牌 Spark全面開啟戰(zhàn)略合作。雙方將以Argo AI VMS為核心,攜手推動(dòng) AI 技術(shù)各大垂直產(chǎn)業(yè)的應(yīng)用發(fā)展。進(jìn)一步延續(xù)雙方智能監(jiān)控場(chǎng)景的成功經(jīng)
    的頭像 發(fā)表于 11-28 14:55 ?578次閱讀

    NVIDIA DGX Spark系統(tǒng)恢復(fù)過程與步驟

    使用 NVIDIA DGX Spark 的過程,可能會(huì)出現(xiàn)配置故障,而導(dǎo)致開發(fā)中斷的問題,本篇教程將帶大家了解如何一步步完成系統(tǒng)恢復(fù)。
    的頭像 發(fā)表于 11-28 09:46 ?6001次閱讀
    NVIDIA DGX <b class='flag-5'>Spark</b>系統(tǒng)恢復(fù)過程與步驟

    NVIDIA DGX Spark助力構(gòu)建自己的AI模型

    2025 年 1 月 6 日,NVIDIA 正式宣布其 Project DIGITS 項(xiàng)目,并于 3 月 18 日更名為 NVIDIA DGX Spark,進(jìn)一步公布了產(chǎn)品細(xì)節(jié)。DGX Spark
    的頭像 發(fā)表于 11-21 09:25 ?1595次閱讀
    NVIDIA DGX <b class='flag-5'>Spark</b>助力構(gòu)建自己的AI模型

    NVIDIA DGX Spark平臺(tái)上對(duì)NVIDIA ConnectX-7 200G網(wǎng)卡配置教程

    NVIDIA DGX Spark 平臺(tái)上對(duì) NVIDIA ConnectX-7 200G 網(wǎng)卡進(jìn)行配置時(shí),會(huì)遇到“4 個(gè)邏輯端口”現(xiàn)象。理解背后的真相是后續(xù)所有配置的基礎(chǔ)。本文將從此現(xiàn)象入手,逐步解析其原理,并提供從基礎(chǔ)配置到深度性能驗(yàn)證的完整流程。
    的頭像 發(fā)表于 11-21 09:19 ?6136次閱讀
    <b class='flag-5'>在</b>NVIDIA DGX <b class='flag-5'>Spark</b>平臺(tái)上對(duì)NVIDIA ConnectX-7 200G網(wǎng)卡配置教程

    NVIDIA DGX Spark快速入門指南

    NVIDIA DGX Spark 已正式向 AI 開發(fā)者交付,對(duì)于剛?cè)胧值娜?DGX Spark,該如何進(jìn)行初始化設(shè)置?本篇文章將引導(dǎo)您完成 DGX Spark 首次設(shè)置。初始設(shè)置
    的頭像 發(fā)表于 11-17 14:11 ?7179次閱讀
    NVIDIA DGX <b class='flag-5'>Spark</b>快速入門指南

    NVIDIA DGX Spark新一代AI超級(jí)計(jì)算機(jī)正式交付

    NVIDIA 創(chuàng)始人兼首席執(zhí)行官黃仁勛 SpaceX 向埃隆·馬斯克交付 DGX Spark。
    的頭像 發(fā)表于 10-21 10:41 ?1555次閱讀

    NVIDIA DGX Spark桌面AI計(jì)算機(jī)開啟預(yù)訂

    DGX Spark 現(xiàn)已開啟預(yù)訂!麗臺(tái)科技作為 NVIDIA 授權(quán)分銷商,提供從產(chǎn)品到服務(wù)的一站式解決方案,助力輕松部署桌面 AI 計(jì)算機(jī)。
    的頭像 發(fā)表于 09-23 17:20 ?1580次閱讀
    NVIDIA DGX <b class='flag-5'>Spark</b>桌面AI計(jì)算機(jī)開啟預(yù)訂

    使用NVIDIA GPU加速Apache SparkParquet數(shù)據(jù)掃描

    的方式組織數(shù)據(jù),這使得 Parquet 查詢時(shí)僅讀取所需的列,而無需掃描整行數(shù)據(jù),即可實(shí)現(xiàn)高性能的查詢和分析。高效的數(shù)據(jù)布局使 Parquet 現(xiàn)代分析生態(tài)系統(tǒng)成為了受歡迎的選擇
    的頭像 發(fā)表于 07-23 10:52 ?1249次閱讀
    使用NVIDIA GPU加速Apache <b class='flag-5'>Spark</b><b class='flag-5'>中</b>Parquet數(shù)據(jù)掃描
    灵宝市| 赤城县| 丹寨县| 安康市| 藁城市| 红河县| 云龙县| 陇西县| 华坪县| 和龙市| 基隆市| 泰宁县| 贡嘎县| 阿尔山市| 法库县| 伽师县| 凤阳县| 乐昌市| 葵青区| 公主岭市| 平顶山市| 济源市| 台前县| 老河口市| 烟台市| 武陟县| 青田县| 福鼎市| 绥芬河市| 榆社县| 托克逊县| 当雄县| 邓州市| 阿鲁科尔沁旗| 江华| 蒲城县| 乌拉特前旗| 阳原县| 京山县| 普兰店市| 双峰县|