簡體   English   中英

在Spark中計算UDF的調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM