簡體   English   中英

org.apache.spark.SparkException: 無法執行用戶定義的函數($anonfun$last3daysMean$1: (string) => double)

[英]org.apache.spark.SparkException: Failed to execute user defined function($anonfun$last3daysMean$1: (string) => double)

val columns = 
  Seq("userid","event_first_login_time","event_last_login_time","event_retention_str")
  
val data = Seq(
("780224", "2020-12-16","2021-08-05","1,5,1,180,1,44"),
   
("780225", "2020-12-16","2021-05-06",",1,2,1,3,14,1,13,2,5,1,28,1,29,4,1,8,1,18,2,1"))
  val df = data.toDF(columns:_*)
  df.show(false)
  
def last3daysMean: (String) => (Double) = (str: String) => {

    val list = str.split(",")
    var total = 0.0
     for (i <- str.length-3 to  str.length-1) {
         total += list(i).toInt;
      }
      var avg= total/3
      avg  }

val convertUDF = udf(last3daysMean)

var df4 = df.withColumn("last3days_mean", convertUDF(col("event_retention_str")))

df4.show(10,false)

您看到的問題是由於索引錯誤。 在您的for循環中,您將針對輸入字符串進行索引,而不是針對針對“,”拆分的數組進行索引。 如果您通讀堆棧跟蹤,則會在其某處出現索引越界異常。 function 的更慣用版本如下所示:

def last3daysMean: (String) => (Double) = (str: String) => {
  str.split(",")
    .takeRight(3)
    .map(_.toInt)
    .sum / 3.0
 }

使用 UDF 時,請注意null值。 您的df4表達式應該包含一個when...otherwise檢查以確保您沒有將任何空值傳遞給 UDF。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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