我想测量大型数据集上udf的性能。 spark SQL是:
spark.sql("SELECT my_udf(value) as results FROM my_table")
udf返回一个数组。我面临的问题是如何在不将数据返回给驱动程序的情况下执行此操作。我需要一个动作,但任何返回完整数据集的东西都会使驱动程序崩溃,例如。收集或我没有运行所有行的计算(show / take(n))。那么如何触发计算而不是将所有数据都返回给驱动程序呢?
答案 0 :(得分:3)
我认为最接近你只能运行你的UDF来测量时序就像下面这样。一般的想法是使用缓存来尝试从测量中删除数据加载时间,然后使用foreach
,它不会使spark运行你的UDF。
val myFunc: String => Int = _.length
val myUdf = udf(myFunc)
val data = Seq("a", "aa", "aaa", "aaaa")
val df = sc.parallelize(data).toDF("text")
// Cache to remove data loading from measurements as much as possible
// Also, do a foreach no-op action to force the data to load and cache before our test
df.cache()
df.foreach(row => {})
// Run the test, grabbing before and after time
val start = System.nanoTime()
val udfDf = df.withColumn("udf_column", myUdf($"text"))
// Force spark to run your UDF and do nothing with the result so we don't include any writing time in our measurement
udfDf.rdd.foreach(row => {})
// Get the total elapsed time
val elapsedNs = System.nanoTime() - start