【发布时间】:2016-11-12 18:58:34
【问题描述】:
Spark 现在提供了可在数据帧中使用的预定义函数,而且它们似乎已经过高度优化。我最初的问题是哪个更快,但我自己做了一些测试,发现火花函数至少在一个实例中快了大约 10 倍。有谁知道为什么会这样,udf 什么时候会更快(仅适用于存在相同 spark 函数的实例)?
这是我的测试代码(在 Databricks 社区版上运行):
# 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 s,而 Spark concat 函数总是需要不到 0.15 s。
【问题讨论】:
标签: performance apache-spark pyspark apache-spark-sql user-defined-functions