給出一個dataframe
作爲
+----+
|col1|
+----+
|abc |
|dBf |
|Aec |
+----+
並有udf
功能
import org.apache.spark.sql.functions._
val testUDF = udf{s: String=>s.toUpperCase}
你絕對可以使用另一個類udf
功能
val demo = df.select(testUDF(col("col1")).as("upperCasedCol"))
這應該給你
+-------------+
|upperCasedCol|
+-------------+
|ABC |
|DBF |
|AEC |
+-------------+
但我建議如果可能的話您使用other functions作爲UDF功能需要被序列化和反序列化列這將耗費時間和內存比其他可用的功能更多。 UDF功能應該是最後的選擇。
您可以使用upper function爲你的情況
val demo = df.select(upper(col("col1")).as("upperCasedCol"))
,這將產生相同的輸出作爲原始udf
功能
我希望答案是有幫助的
更新
因爲你的問題是要求提供信息關於如何調用另一個類或對象定義的UDF功能,這裏是法
假設你有,你所定義的UDF函數或者說,我建議作爲
import org.apache.spark.sql.Column
import org.apache.spark.sql.functions._
object UDFs {
def testUDF = udf{s: String=>s.toUpperCase}
def testUpper(column: Column) = upper(column)
}
您的A類函數的對象是你的問題,我只是增加了一個功能
import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.functions._
class A(df: DataFrame) {
def testMethod(): DataFrame = {
val demo = df.select(UDFs.testUDF(col("col1")))
demo
}
def usingUpper() = {
df.select(UDFs.testUpper(col("col1")))
}
}
然後就可以調用從主要功能如下
import org.apache.spark.sql.SparkSession
object TestUpper {
def main(args: Array[String]): Unit = {
val sparkSession = SparkSession.builder().appName("Simple Application")
.master("local")
.config("", "")
.getOrCreate()
import sparkSession.implicits._
val df = Seq(
("abc"),
("dBf"),
("Aec")
).toDF("col1")
val a = new A(df)
//calling udf function
a.testMethod().show(false)
//calling upper function
a.usingUpper().show(false)
}
}
我想這是多有幫助
是絕對有可能:) –
你問如何從創建UDF方法中的函數?如何爲通用函數創建UDF?如何將其傳遞給testMethod?最終目標是什麼? –
你決定接受答案嗎? –