0

J'ai une exigence, où je dois filtrer les lignes de la trame de l'étincelle où la valeur d'une certaine colonne (disons "prix") doit correspondre aux valeurs présentes dans une carte scala. La clé de la carte scala est la valeur d'une autre colonne (disons "id"). Ma base de données contient deux colonnes: ID et prix. J'ai besoin de filtrer toutes les colonnes où le prix ne correspond pas au prix mentionné dans la carte scala.Extraction de la valeur des colonnes dans la structure de données d'étincelles

Mon code ressemble à ceci:

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 
    } 
} 

Je ne suis pas en mesure de passer la valeur des colonnes id pour fonctionner obj1.getPrice(). Toute suggestion pour y parvenir?

Merci,

Répondre

0

Vous pouvez écrire un udf pour ce faire:

val checkPrice(id: String, price: String) = validIds.exists(_ == id) && obj1.getPrice(id) == price 
val checkPriceUdf = udf(checkPrice) 

baseDataFrame.where(checkPriceUdf($"id", $"price")) 

Ou une autre solution est de convertir le Map de id -> prix à une trame de données, puis faire une intérieure joindre avec baseDataFrame sur les colonnes id et price.