7

स्पार्क अब पूर्वनिर्धारित कार्यों की पेशकश करता है जिनका उपयोग डेटा फ्रेम में किया जा सकता है, और ऐसा लगता है कि वे अत्यधिक अनुकूलित हैं। मेरा मूल प्रश्न तेजी से चल रहा था, लेकिन मैंने कुछ परीक्षण किया और पाया कि स्पार्क फ़ंक्शंस कम से कम एक बार में लगभग 10 गुना तेज हो गया है। क्या किसी को पता है कि ऐसा क्यों है, और जब एक udf तेज होगा (केवल उदाहरण के लिए कि एक समान स्पार्क फ़ंक्शन मौजूद है)?स्पार्क फ़ंक्शंस बनाम यूडीएफ प्रदर्शन?

# UDF vs Spark function 
from faker import Factory 
from 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 Row 
def 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 repeatedly 
def 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() 

यूडीएफ समारोह:

यहाँ मेरी परीक्षण कोड है (Databricks समुदाय एड पर चलते थे)

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() 

दोनों को कई बार Ran, udf आमतौर पर लगभग 1.1 - 1.4 एस लिया, और स्पार्क concat समारोह हमेशा 0.15 एस के तहत लिया।

उत्तर

15

जब एक यूडीएफ तेजी

यदि आप अजगर यूडीएफ के बारे में पूछने जवाब शायद कभी नहीं होती। चूंकि एसक्यूएल फ़ंक्शंस अपेक्षाकृत सरल हैं और जटिल कार्यों के लिए डिज़ाइन नहीं किए गए हैं, इसलिए यह पाइथन दुभाषिया और जेवीएम के बीच दोहराए गए क्रमिकरण, deserialization और डेटा आंदोलन की लागत को काफी असंभव है।

क्या किसी को पता है कि क्यों यह इतना है

मुख्य कारण पहले से ही ऊपर enumerated हैं और एक साधारण तथ्य यह है कि स्पार्क DataFrame देशी रूप एक JVM संरचना और आदर्श पहुंच तरीकों है सरल द्वारा कार्यान्वित किया जाता करने के लिए कम किया जा सकता जावा एपीआई को कॉल दूसरी तरफ से यूडीएफ पाइथन में लागू किया जाता है और आगे और आगे डेटा की आवश्यकता होती है।

जबकि पीएसस्पर्क को सामान्य रूप से जेवीएम और पायथन के बीच डेटा आंदोलनों की आवश्यकता होती है, निम्न स्तर के आरडीडी एपीआई के मामले में इसे आम तौर पर महंगा सर्ड गतिविधि की आवश्यकता नहीं होती है। स्पार्क एसक्यूएल क्रमशः डेटा को स्थानांतरित करने की लागत और जेवीएम पर असुरक्षित प्रतिनिधित्व के लिए अतिरिक्त लागत जोड़ता है। बाद में सभी यूडीएफ (पायथन, स्कैला और जावा) के लिए विशिष्ट है लेकिन पूर्व में गैर-मूल भाषाओं के लिए विशिष्ट है।

यूडीएफ के विपरीत, स्पार्क एसक्यूएल फ़ंक्शन सीधे जेवीएम पर काम करते हैं और आमतौर पर उत्प्रेरक और टंगस्टन दोनों के साथ एकीकृत होते हैं। इसका मतलब है कि इन्हें निष्पादन योजना में अनुकूलित किया जा सकता है और अधिकांश समय कोडेजन और अन्य टंगस्टन अनुकूलन से लाभ प्राप्त हो सकता है। इसके अलावा ये अपने "मूल" प्रतिनिधित्व में डेटा पर काम कर सकते हैं।

तो एक मायने में समस्या यह है कि पाइथन यूडीएफ को कोड में डेटा लाने पड़ते हैं जबकि एसक्यूएल एक्सप्रेशन दूसरी तरफ जाते हैं।

+0

बढ़िया जवाब, मैं के लिए उपयोगी था। मुझे संदेह था कि यह पायथन-जावा के बीच डेटा शफल करने के कारण था, बस यकीन नहीं था। मैं अतिरिक्त जानकारी की सराहना करता हूं कि इन्हें उत्प्रेरक और टंगस्टन से भी फायदा हो सकता है, इसलिए मेरे कोड में जितना संभव हो उतना लागू करना और यूडीएफ को कम करना मेरे लिए बहुत महत्वपूर्ण होगा। विषय से थोड़ी दूर, लेकिन क्या आपको पता चलेगा कि क्या स्पैम डेटाफ्रेम पर जल्द ही संख्यात्मक क्षमताएं आ रही हैं? इसने मेरी परियोजनाओं में से एक को आरडीडी पर काफी हद तक रखा है। – alfredox

+0

मुझे यकीन नहीं है कि "numpy क्षमताओं" से आपका क्या मतलब है। – zero323

+0

आप एक पंक्ति तत्व के रूप में एक numpy सरणी नहीं जोड़ सकते हैं। वर्तमान में स्पार्क पंक्तियां अलग-अलग डेटा प्रकारों का समर्थन करती हैं जैसे स्ट्रिंगटाइप, बूलटाइप, फ़्लोट टाइप, लेकिन आप वहां एक numpy सरणी को सहेज नहीं सकते हैं। – alfredox

0

30 अक्टूबर, 2017 के बाद से, स्पार्क ने अभी पेस्पार्क के लिए वेक्टरीकृत पीडीएफ प्रस्तुत किए।

https://databricks.com/blog/2017/10/30/introducing-vectorized-udfs-for-pyspark.html

कारण यह है कि अजगर यूडीएफ धीमी है, शायद PySpark यूडीएफ एक सबसे अनुकूलित तरह से लागू नहीं किया गया है:

लिंक से पैरा के अनुसार।

स्पार्क ने उपयोगकर्ता परिभाषित कार्यों के समर्थन के साथ संस्करण 0.7 में एक पायथन एपीआई जोड़ा। ये उपयोगकर्ता परिभाषित फ़ंक्शन एक-पंक्ति-पर-एक-समय संचालित करते हैं, और इस प्रकार उच्च क्रमबद्धता और आमंत्रण ओवरहेड से पीड़ित होते हैं।

हालांकि नव vectorized pdfs प्रदर्शन एक बहुत में सुधार हो रहे हैं:

3x से 100x अधिक को लेकर।

enter image description here

संबंधित मुद्दे