我想比较两个Spark用户定义的函数,看看哪个更快。具体来说,我希望看到isEvenUdf
与isEvenOptionUdf
相比运行得更快。
def isEven(n: Integer): Boolean = {
if (n == null) {
false
} else {
n % 2 == 0
}
}
val isEvenUdf = udf[Boolean, Integer](isEven)
def isEvenOption(n: Integer): Option[Boolean] = {
val num = Option(n).getOrElse(return Some(false))
Some(num % 2 == 0)
}
val isEvenOptionUdf = udf[Option[Boolean], Integer](isEvenOption)
Databricks Scala style guide document说"对于性能敏感的代码,首选null而不是Option,以避免虚拟方法调用和装箱"这就是我认为isEvenOptionUdf
速度较慢的原因。我想量化它的速度有多慢。
Spark很难进行基准测试,因为所有内容都会被懒散地评估。
以下是我所研究的内容:
This solution似乎有点过于简单了。
Databricks有一个spark-perf
library,但它看起来并不容易使用。
以下是我可以对代码进行基准测试的方法。创建一个包含100万个数值和100万个df
值的DataFrame(null
),并测量此代码的执行时间。
df.withColumn("is_even", NumberFun.isEvenUdf(col("number")))
df.cache
df.count // force the DAG to be executed
然后我可以使用isEvenOptionUdf
运行相同的代码并比较时间。如果有更好的方法/库,请告诉我。