我有一個如下的scala地圖
val funcMap:地圖(字串,字串)
(country_code, formatting_function_name)
(AU,function001)
(BH,function006)
(CN,function007)
(IN,function001)
在給定的資料幀(indf)上,
id,country
001,AU
002,BH
003,CN
004,IN
我需要使用此映射執行查找并執行以“id”作為引數回傳的函式,以獲取名為“mapped_id”的列。例如。對于 AU -> mapped_id 列應該呼叫 function001("id")
indf.withcolumn("mapped_id",funcMap(col("country_code"))) //<- need to execute the returned function here eg: function001("id") to get the formatted value of id
這些函式可以在具有不同格式邏輯的 functions.scala 檔案中定義,例如。
def function001(id:String): String = {
lpad(id,5,"0")
}
def function002(id:String): String = {
rpad(id,5,"0")
}
如何根據地圖回傳的名稱呼叫該函式?
uj5u.com熱心網友回復:
擁有Mapfromcountry_code -> formatting_function_name意味著您需要另一層將函式名稱轉換為函式呼叫。您可以避免這種情況,因為在 Scala 中,函式是一等物體,這意味著它們可以作為引數傳遞給其他函式,因為函式是物件。
Map一個直接的解決方案是根據格式化函式的型別更改值型別引數。這就是我的意思:
val funcMap: Map[String, String => String]
現在您可以創建格式String供您country_code使用:
indf.withcolumn("mapped_id", funcMap("country_code")("mapped_id"))
這是一個快速測驗:
object Something extends App {
val Id = "someId"
val Au = "AU"
val Bh = "BH"
val Cn = "CN"
val In = "IN"
def function001(id: String): String = s"$id function001"
def function002(id: String): String = s"$id function002"
def function003(id: String): String = s"$id function003"
def function004(id: String): String = s"$id function004"
val funcMap = Map[String, String => String](
Au -> function001,
Bh -> function002,
Cn -> function003,
In -> function004
)
println(funcMap(Au)(Id))
}
輸出:
someId function001
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/493061.html
