Spark臨時(shí)表tempView的注冊(cè)/使用/注銷(xiāo)/注意事項(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后,查詢(xún)這個(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") 注銷(xiāo)
spark.catalog.dropTempView("tempViewName")
spark.catalog.dropGlobalTempView("tempViewName")方式2
創(chuàng)建
session.table("tempViewName").cache()注銷(xiāo)
session.table("tempViewName").unpersist()方式3
創(chuàng)建
commonDF.cahe() 或 commonDF.persist(StorageLevel.MEMORY_AND_DISK)
commonDF.createOrReplaceTempView("tempViewName")注銷(xiāo)
commonDF.unpersist()
臨時(shí)表生命周期
源碼
createOrReplaceTempView
/**
* 使用給定名稱(chēng)創(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
/**
* 使用給定名稱(chēng)創(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),我們必須使用限定名稱(chēng)來(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āo)/注意事項(xiàng)的文章就介紹到這了,更多相關(guān)Spark臨時(shí)表tempView內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL Server的Descending Indexes降序索引實(shí)例展示
在涉及多字段排序的復(fù)雜查詢(xún)中,合理使用降序索引可以顯著提升SQLServer的查詢(xún)效率,本文通過(guò)構(gòu)建實(shí)際的查詢(xún)案例,展示了如何在SQLServer中建立并利用降序索引優(yōu)化查詢(xún)性能,感興趣的朋友一起看看吧2024-09-09
SQL Server誤區(qū)30日談 第9天 數(shù)據(jù)庫(kù)文件收縮不會(huì)影響性能
收縮文件的過(guò)程非常影響性能,這個(gè)過(guò)程需要移動(dòng)大量數(shù)據(jù)從而造成大量IO,這個(gè)過(guò)程會(huì)被記錄到日志從而造成日志暴漲,相應(yīng)的,還會(huì)占去大量的CPU資源2013-01-01
sqlserver 動(dòng)態(tài)創(chuàng)建臨時(shí)表的語(yǔ)句分享
開(kāi)發(fā)業(yè)務(wù)需求,需要對(duì)一個(gè)表作數(shù)據(jù)分析,由于數(shù)據(jù)量較大,而且分析時(shí)字段會(huì)隨條件相應(yīng)變化而變化2012-01-01
SQL中varchar和nvarchar的基本介紹及其區(qū)別
varchar長(zhǎng)度為 n 個(gè)字節(jié)的可變長(zhǎng)度且非 Unicode 的字符數(shù)據(jù),nvarchar包含 n 個(gè)字符的可變長(zhǎng)度 Unicode 字符數(shù)據(jù)2014-07-07
sqlserver中如何查詢(xún)出連續(xù)日期記錄的代碼
Insus.NET嘗試寫(xiě)了程序并做了測(cè)試,可以得到預(yù)期的結(jié)果,SQL代碼可參考和學(xué)習(xí)之用。2011-09-09
SQL Server 復(fù)制需要有實(shí)際的服務(wù)器名稱(chēng)才能連接到服務(wù)器
今天在做sql Server 2005的實(shí)驗(yàn)的時(shí)候碰到的問(wèn)題,問(wèn)題描述很清楚,懷疑是我以前給計(jì)算機(jī)修改了名稱(chēng)而導(dǎo)致的.可以用select @@servername和select serverproperty ('servername')對(duì)照一下,兩個(gè)的結(jié)果是否一樣2012-06-06

