提取spark数据框

时间:2017-10-03 14:01:46

标签: scala apache-spark apache-spark-sql spark-dataframe spark-streaming

我有一个要求,我需要从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()。 有什么建议如何实现这个目标?

谢谢,

1 个答案:

答案 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 - >价格到数据框,然后在baseDataFrameid列上与price进行内部联接。