Spark臨時(shí)表tempView的注冊(cè)/使用/注銷/注意事項(xiàng)(推薦)
createTempView運(yùn)作原理
先說(shuō)一個(gè)眾人皆知的知識(shí):
Spark中的算子包含transformation算子和action算子,transformation是根據(jù)原有RDD創(chuàng)建一個(gè)新的RDD,而action則把RDD操作后的結(jié)果返回給driver。Spark對(duì)transformation的抽象可以大大提高性能,這是因?yàn)樵赟park中,所有transformation操作都是lazy模式,即Spark不會(huì)立即計(jì)算結(jié)果,而只是簡(jiǎn)單地記住所有對(duì)數(shù)據(jù)集的轉(zhuǎn)換操作邏輯。這些轉(zhuǎn)換只有遇到action操作的時(shí)候才會(huì)開(kāi)始計(jì)算。這樣的設(shè)計(jì)使得Spark更加高效。
低效做法
sql("select a,b from table where xxx").createTempView("view1") sql("select a from view1 where xxx").show() sql("select b from view1 where xxx").show()
使用createTempView后,查詢這個(gè)視圖每次都很耗時(shí)了,正是因?yàn)閏reateTempView操作是lazy模式,在沒(méi)有action算子觸發(fā)之前,它并沒(méi)有什么實(shí)質(zhì)性的運(yùn)作,僅僅記錄了一個(gè)創(chuàng)建視圖的邏輯
。
Spark每次遇到action算子show()方法的時(shí)候,才開(kāi)始真正計(jì)算,上面代碼中兩次用到視圖view1
,那么意味著創(chuàng)建視圖的方法會(huì)執(zhí)行兩次
,因此非常的耗時(shí),所以需要對(duì)view1進(jìn)行緩存處理
。
緩存臨時(shí)表方式:
方式1 創(chuàng)建
// 創(chuàng)建它的SparkSession對(duì)象終止前有效 df.createOrReplaceTempView("tempViewName") // spark應(yīng)用程序終止前有效 df.createOrReplaceGlobalTempView("tempViewName")
注銷
spark.catalog.dropTempView("tempViewName") spark.catalog.dropGlobalTempView("tempViewName")
方式2
創(chuàng)建
session.table("tempViewName").cache()
注銷
session.table("tempViewName").unpersist()
方式3
創(chuàng)建
commonDF.cahe() 或 commonDF.persist(StorageLevel.MEMORY_AND_DISK) commonDF.createOrReplaceTempView("tempViewName")
注銷
commonDF.unpersist()
臨時(shí)表生命周期
源碼
createOrReplaceTempView
/** * 使用給定名稱創(chuàng)建本地臨時(shí)視圖。此臨時(shí)視圖的生命周期與用于創(chuàng)建此數(shù)據(jù)集的 SparkSession 相關(guān)聯(lián)。 * * @group basic * @since 2.0.0 */ def createOrReplaceTempView(viewName: String): Unit = withPlan { createTempViewCommand(viewName, replace = true, global = false) }
也就是說(shuō),當(dāng)一下代碼中spark stop(),之后 創(chuàng)建的臨時(shí)視圖表才失效
createGlobalTempView
/** * 使用給定名稱創(chuàng)建一個(gè)全局臨時(shí)視圖。此臨時(shí)視圖的生命周期與此 Spark 應(yīng)用程序相關(guān)聯(lián)。全局臨時(shí)視圖是跨會(huì)話的。它的生命周期是 Spark 應(yīng)用程序的生命周期,即當(dāng)應(yīng)用程序終止時(shí)它會(huì)被自動(dòng)刪除。它與系統(tǒng)保留的數(shù)據(jù)庫(kù) global_temp 相關(guān)聯(lián),我們必須使用限定名稱來(lái)引用全局臨時(shí)視圖,例如從 global_temp.view1 中選擇。 * * @throws AnalysisException if the view name is invalid or already exists * * @group basic * @since 2.1.0 */ @throws[AnalysisException] def createGlobalTempView(viewName: String): Unit = withPlan { createTempViewCommand(viewName, replace = false, global = true) }
到此這篇關(guān)于Spark臨時(shí)表tempView的注冊(cè)/使用/注銷/注意事項(xiàng)的文章就介紹到這了,更多相關(guān)Spark臨時(shí)表tempView內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQLSERVER的非聚集索引結(jié)構(gòu)深度理解
非聚集索引也是堆結(jié)構(gòu)?其實(shí)SQLSERVER有幾種頁(yè)面類型(數(shù)據(jù)都使用一頁(yè)一頁(yè)來(lái)存儲(chǔ),就像Windows的內(nèi)存也是使用頁(yè)面來(lái)組織的)感興趣的朋友可以了解下,希望本文可以增加你們對(duì)非聚集索引結(jié)構(gòu)的理解2013-01-01SQL Server連接中三個(gè)常見(jiàn)的錯(cuò)誤分析
SQL Server連接中三個(gè)常見(jiàn)的錯(cuò)誤分析...2007-03-03SQL高級(jí)應(yīng)用之使用SQL查詢Excel表格數(shù)據(jù)的方法
本文和大家講下如何在SQL Server分析器中查詢Excel電子表格的數(shù)據(jù),其實(shí)很簡(jiǎn)單的,來(lái)看下下面的SQL語(yǔ)句吧。2010-03-03SQL Server自動(dòng)生成日期加數(shù)字的序列號(hào)
需要生成下面的序列號(hào),前半部分是yyyymmdd格式的年月日時(shí)間數(shù)字,后半部分則是每天都從1順序增長(zhǎng)的數(shù)字,位數(shù)要固定,中間不足的補(bǔ)0。2009-08-08SQL server中提示對(duì)象名無(wú)效的解決方法
本文主要介紹了SQL server中提示對(duì)象名無(wú)效的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01sql?server如何去除數(shù)據(jù)中的一些無(wú)用的空格
這篇文章主要介紹了sql?server去除數(shù)據(jù)中的一些無(wú)用的空格,本文給大家提到了一些常用的函數(shù),結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05SQL 實(shí)現(xiàn)某時(shí)間段的統(tǒng)計(jì)業(yè)務(wù)
有一張錯(cuò)誤上報(bào)表,現(xiàn)在要做的是統(tǒng)計(jì)在某個(gè)時(shí)間段[beginTime,endTime](其中beginTime,endTime由前臺(tái)進(jìn)行傳入)內(nèi),每個(gè)上報(bào)人上報(bào)錯(cuò)誤點(diǎn)的總數(shù)以及已解決錯(cuò)誤的總數(shù),閑話不說(shuō),看代碼2013-01-01MSSQL數(shù)據(jù)庫(kù)排序規(guī)則如何更改
更改 SQL Server 2005 實(shí)例的默認(rèn)排序規(guī)則的操作可能會(huì)比較復(fù)雜,本文將提供詳細(xì)的操作步驟,需要了解的朋友可以參考下2012-11-11