最佳答案
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秒,而 Spark concat
功能总是在0.15秒以下。