我有一个要求,我需要从spark数据帧中过滤掉某些列的值(比如“price”)需要与scala map中的值匹配.scala map的键值是另一栏(说“id”)。 我的数据框包含两列:id和price。 我需要过滤掉价格与scala地图中提到的价格不匹配的所有列。
我的代码类似于:
object obj1{
// This method returns value price for items as per their id
getPrice(id:String):String {
//lookup in a map and return the price
}
}
object Main{
val validIds = Seq[String]("1","2","3","4")
val filteredDf = baseDataframe.where(baseDataframe("id").in(validIDs.map(lit(_)): _*) &&
baseDataframe("price") === (obj1.getPrice(baseDataframe("id").toString())))
// But this line send string "id" to obj1.getPrice() function
// rather than value of id column
}
}
我无法将id列的值传递给函数obj1.getPrice()。 有什么建议如何实现这个目标?
谢谢,
答案 0 :(得分:0)
您可以编写一个udf来执行此操作:
val checkPrice(id: String, price: String) = validIds.exists(_ == id) && obj1.getPrice(id) == price
val checkPriceUdf = udf(checkPrice)
baseDataFrame.where(checkPriceUdf($"id", $"price"))
或另一种解决方案是转换 id的Map
- >价格到数据框,然后在baseDataFrame
和id
列上与price
进行内部联接。