Spark теперь предлагает предопределенные функции, которые могут использоваться в информационных фреймах, и кажется, что они высоко оптимизированы. Мой первоначальный вопрос был о том, что будет быстрее, но я провел некоторое тестирование и обнаружил, что функции зажигания примерно в 10 раз быстрее, по крайней мере, в одном случае. Кто-нибудь знает, почему это так, и когда udf будет быстрее (только для случаев, когда существует идентичная функция искры)?
Вот мой тестовый код (запущенный в сообществе Databricks 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:
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()
Запускался несколько раз, udf обычно занимал около 1,1–1,4 с, а concat
функция Spark всегда выполнялась менее 0,15 с.