第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

火花函數(shù)對(duì)UDF性能的影響?

火花函數(shù)對(duì)UDF性能的影響?

回首憶惘然 2019-07-17 16:44:57
火花函數(shù)對(duì)UDF性能的影響?SPARK現(xiàn)在提供了預(yù)定義的函數(shù),可以在數(shù)據(jù)倉(cāng)庫(kù)中使用,而且看起來它們是高度優(yōu)化的。我最初的問題是哪個(gè)更快,但我自己做了一些測(cè)試,發(fā)現(xiàn)火花函數(shù)至少在一個(gè)例子中快了10倍。有誰知道為什么會(huì)這樣,以及什么時(shí)候UDF會(huì)更快(僅在存在相同火花函數(shù)的情況下)?下面是我的測(cè)試代碼(運(yùn)行在Databricks社區(qū)ed上):# UDF vs Spark functionfrom faker import Factoryfrom pyspark.sql.functions import lit, concat fake = Factory.create()fake.seed(4321)# Each entry consists of last_name, first_name, ssn, job, and age (at least 1)from pyspark.sql import Rowdef fake_entry():   name = fake.name().split()   return (name[1], name[0], fake.ssn(), fake.job(), abs(2016 - fake.date_time().year) + 1)# Create a helper function to call a function repeatedlydef repeat(times, func, *args, **kwargs):     for _ in xrange(times):         yield func(*args, **kwargs)data = list(repeat(500000, fake_entry))print len(data)data[0]dataDF = sqlContext.createDataFrame(data, ('last_name', 'first_name', 'ssn', 'occupation', 'age'))dataDF.cache()UDF功能:concat_s = udf(lambda s: s+ 's')udfData = dataDF.select(concat_s(dataDF.first_name).alias('name'))udfData.count()火花功能:spfData = dataDF.select(concat(dataDF.first_name, lit('s')).alias('name'))spfData.count()運(yùn)行兩次,UDF通常需要1.1-1.4秒,而火花concat函數(shù)總是在0.15秒以下。
查看完整描述

2 回答

?
慕村9548890

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊

什么時(shí)候UDF會(huì)更快

如果您詢問PythonUDF,答案可能是永遠(yuǎn)不會(huì)*。由于SQL函數(shù)相對(duì)簡(jiǎn)單,而且不是為復(fù)雜的任務(wù)設(shè)計(jì)的,因此它幾乎不可能補(bǔ)償Python解釋器和JVM之間重復(fù)序列化、反序列化和數(shù)據(jù)移動(dòng)的成本。

有誰知道這是為什么

上面已經(jīng)列舉了主要的原因,可以歸結(jié)為一個(gè)簡(jiǎn)單的事實(shí),即星火。DataFrame它本身就是一個(gè)JVM結(jié)構(gòu),標(biāo)準(zhǔn)的訪問方法是通過對(duì)JavaAPI的簡(jiǎn)單調(diào)用來實(shí)現(xiàn)的。另一方面,UDF是用Python實(shí)現(xiàn)的,需要來回移動(dòng)數(shù)據(jù)。

雖然PySPark通常需要JVM和Python之間的數(shù)據(jù)移動(dòng),但是對(duì)于低級(jí)別的RDDAPI,它通常不需要昂貴的serde活動(dòng)。SPARK SQL增加了序列化和序列化的額外成本,以及將數(shù)據(jù)從JVM上轉(zhuǎn)移到不安全表示的成本。后者是針對(duì)所有UDF(Python、Scala和Java)的,但前者是針對(duì)非本地語(yǔ)言的。

與UDF不同,SparkSQL函數(shù)直接在JVM上運(yùn)行,通常與催化劑和鎢都集成得很好。這意味著可以在執(zhí)行計(jì)劃中對(duì)其進(jìn)行優(yōu)化,并且大多數(shù)情況下可以從cocogen和其他鎢優(yōu)化中獲益。此外,它們還可以對(duì)其“本機(jī)”表示中的數(shù)據(jù)進(jìn)行操作。

因此,在某種意義上,這里的問題是PythonUDF必須將數(shù)據(jù)帶到代碼中,而SQL表達(dá)式則相反。


*根據(jù)粗略估計(jì)PySPark窗口UDF可以擊敗Scala窗口函數(shù)。


查看完整回答
反對(duì) 回復(fù) 2019-07-17
  • 2 回答
  • 0 關(guān)注
  • 803 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)