Spark bietet jetzt vordefinierte Funktionen, die in Datenrahmen verwendet werden können, und es scheint, dass sie stark optimiert sind. Meine ursprüngliche Frage sollte schneller sein, aber ich habe selbst einige Tests durchgeführt und festgestellt, dass die Funkenfunktionen zumindest in einem Fall etwa 10 mal schneller sind. Weiß jemand, warum dies so ist, und wann würde ein udf schneller sein (nur für Fälle, in denen eine identische Funkenfunktion existiert)?Spark-Funktionen vs UDF-Leistung?
Hier mein Testcode (lief auf Databricks Gemeinschaft ed):
# 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()
UDF-Funktion:
concat_s = udf(lambda s: s+ 's')
udfData = dataDF.select(concat_s(dataDF.first_name).alias('name'))
udfData.count()
Spark-Funktion:
spfData = dataDF.select(concat(dataDF.first_name, lit('s')).alias('name'))
spfData.count()
beide mehrmals Ran, die udf benötigte normalerweise etwa 1,1 - 1,4 s, und die Spark Concat-Funktion nahm immer weniger als 0,15 s in Anspruch.
Fantastische Antwort, genau das, was ich suchte. Ich vermutete, dass es aufgrund von Datenverschiebungen zwischen Python-Java war, war nur nicht sicher. Ich schätze die zusätzlichen Informationen, dass diese auch von Catalyst und Tungsten profitieren können, daher wird es für mich viel wichtiger sein, sie so weit wie möglich in meinen Code zu implementieren und UDFs zu minimieren. Ein bisschen abseits von Thema, aber würden Sie zufällig wissen, ob numpy Fähigkeiten zu Spark Dataframes bald kommen werden? Dies hat eines meiner Projekte weitgehend auf RDDs gehalten. – alfredox
Ich bin nicht sicher, was genau Sie mit "numpy Fähigkeiten" meinen. – zero323
Sie können ein numpiges Array nicht als Zeilenelement hinzufügen. Derzeit unterstützen Spark Rows verschiedene Datentypen wie StringType, BoolType, FloatType, aber Sie können dort kein numpy Array speichern. – alfredox