[英]How to use non udf method in Spark?
我的代碼如下
myDF.map{ x =>
val inp = MyUtils.doSomething(x.value) //accepts Int values and return Int
MyInfo(inp)
}
這里 MyUtils.doSomething 在我的 spark MyUtils.doSomething
代碼中是正常的 function (non UDF)
。 它工作正常
但是當我這樣做時
val DF = myDF.withColumn("value", lit(MyUtils.doSomething(col("value").asInstanceOf[Int].toInt)))
為什么它顯示錯誤
class org.apache.spark.sql.Column cannot be cast to class java.lang.Integer
我怎樣才能解決這個問題? 有什么方法可以獲得col("value")
的基礎值,以便我可以在我的doSomething
function 中使用它。
不知道為什么col("value").asInstanceOf[Int].toInt
它沒有給出 Int 值?
不知道為什么 col("value").asInstanceOf[Int].toInt 它沒有給出 Int 值?
好吧,因為您想如何轉換Column("colName", 21, false)
? asInstanceOf
基本上會使編譯器忽略這樣一個事實,即Column
類型的 object 是 integer,而您將在運行時面臨異常。 您應該以一種甚至不需要asInstanceOf
的方式編寫代碼。 關於您的第一個考慮, UDF
基本上是一個 function,由 spark 序列化為 spark 從站並在列上執行,因此您必須這樣做:
import org.apache.spark.sql.functions._
val doSomethingUdf = udf(MyUtils.doSomething)
// if doSomething is defined as a method "def doSomething ..."
// then it would be better to do
// udf(MyUtils.doSomething _)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.