基准Spark用户定义的功能

时间:2017-01-27 17:52:53

标签: scala apache-spark user-defined-functions

我想比较两个Spark用户定义的函数,看看哪个更快。具体来说,我希望看到isEvenUdfisEvenOptionUdf相比运行得更快。

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很难进行基准测试,因为所有内容都会被懒散地评估。

以下是我所研究的内容:

以下是我可以对代码进行基准测试的方法。创建一个包含100万个数值和100万个df值的DataFrame(null),并测量此代码的执行时间。

df.withColumn("is_even", NumberFun.isEvenUdf(col("number")))
df.cache
df.count // force the DAG to be executed 

然后我可以使用isEvenOptionUdf运行相同的代码并比较时间。如果有更好的方法/库,请告诉我。

0 个答案:

没有答案