स्पार्क अब पूर्वनिर्धारित कार्यों की पेशकश करता है जिनका उपयोग डेटा फ्रेम में किया जा सकता है, और ऐसा लगता है कि वे अत्यधिक अनुकूलित हैं। मेरा मूल प्रश्न तेजी से चल रहा था, लेकिन मैंने कुछ परीक्षण किया और पाया कि स्पार्क फ़ंक्शंस कम से कम एक बार में लगभग 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 एस के तहत लिया।
बढ़िया जवाब, मैं के लिए उपयोगी था। मुझे संदेह था कि यह पायथन-जावा के बीच डेटा शफल करने के कारण था, बस यकीन नहीं था। मैं अतिरिक्त जानकारी की सराहना करता हूं कि इन्हें उत्प्रेरक और टंगस्टन से भी फायदा हो सकता है, इसलिए मेरे कोड में जितना संभव हो उतना लागू करना और यूडीएफ को कम करना मेरे लिए बहुत महत्वपूर्ण होगा। विषय से थोड़ी दूर, लेकिन क्या आपको पता चलेगा कि क्या स्पैम डेटाफ्रेम पर जल्द ही संख्यात्मक क्षमताएं आ रही हैं? इसने मेरी परियोजनाओं में से एक को आरडीडी पर काफी हद तक रखा है। – alfredox
मुझे यकीन नहीं है कि "numpy क्षमताओं" से आपका क्या मतलब है। – zero323
आप एक पंक्ति तत्व के रूप में एक numpy सरणी नहीं जोड़ सकते हैं। वर्तमान में स्पार्क पंक्तियां अलग-अलग डेटा प्रकारों का समर्थन करती हैं जैसे स्ट्रिंगटाइप, बूलटाइप, फ़्लोट टाइप, लेकिन आप वहां एक numpy सरणी को सहेज नहीं सकते हैं। – alfredox