[英]Count calls of UDF in Spark
使用Spark 1.6.1我想調用UDF的調用次數。 我想這樣做是因為我有一個非常昂貴的UDF(每次調用大約1秒), 我懷疑UDF被調用的次數比我數據幀中的記錄數要多,這使得我的spark工作速度慢於必要 。
雖然我無法重現這種情況,但我想出了一個簡單的例子,顯示對UDF的調用次數似乎與行數不同(此處:更少),這怎么可能?
import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.functions.udf
object Demo extends App {
val conf = new SparkConf().setMaster("local[4]").setAppName("Demo")
val sc = new SparkContext(conf)
sc.setLogLevel("WARN")
val sqlContext = new SQLContext(sc)
import sqlContext.implicits._
val callCounter = sc.accumulator(0)
val df= sc.parallelize(1 to 10000,numSlices = 100).toDF("value")
println(df.count) // gives 10000
val myudf = udf((d:Int) => {callCounter.add(1);d})
val res = df.withColumn("result",myudf($"value")).cache
println(res.select($"result").collect().size) // gives 10000
println(callCounter.value) // gives 9941
}
如果使用累加器不是調用UDF計數的正確方法,我還能怎樣做呢?
注意:在我的實際Spark-Job中,獲得的呼叫計數大約是實際記錄數的1.7倍。
Spark應用程序應定義main()方法,而不是擴展scala.App。 scala.App的子類可能無法正常工作。
import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.functions.udf
object Demo extends App {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("Simple Application").setMaster("local[4]")
val sc = new SparkContext(conf)
// [...]
}
}
這應該可以解決您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.