Comment mettre à jour la colonne en fonction d'une condition (une valeur dans un groupe)?
J'ai le texte suivant df:
+---+----+-----+
|sno|dept|color|
+---+----+-----+
| 1| fn| red|
| 2| fn| blue|
| 3| fn|green|
+---+----+-----+
Si la couleur l'une des valeurs de la colonne est red
, puis j'ai toutes les valeurs de la colonne de couleur doit être mis à jour pour être red
, comme ci-dessous:
+---+----+-----+
|sno|dept|color|
+---+----+-----+
| 1| fn| red|
| 2| fn| red|
| 3| fn| red|
+---+----+-----+
Je ne pouvais pas le comprendre. S'il vous plaît aider; j'ai essayé le code suivant:
val gp=jdbcDF.filter($"dept".contains("fn"))
//.withColumn("newone",when($"dept"==="fn","RED").otherwise("NULL"))
gp.show()
gp.map(
row=>{
val row1=row.getAs[String](1)
var row2=row.getAs[String](2)
val make=if(row1 =="fn") row2="red"
Row(row(0),row(1),make)
}
).collect().foreach(println)
Vous devez vous connecter pour publier un commentaire.
Donné:
De faire le calcul:
La
result
se présente comme suit (qui semble être une réponse):Vous pouvez la chaîne
when
opérateurs et ont une valeur par défaut avecotherwise
. Consulter le scaladoc dequand
de l'opérateur.Je pense que vous pourriez faire quelque chose de très similaire (et peut-être la plus efficace) à l'aide fenêtré opérateurs ou définis par l'utilisateur fonctions d'agrégation (udaf, nous), mais...eh bien...n'avez pas actuellement de savoir comment le faire. Laissant le commentaire ici pour en inspirer d'autres 😉
p.s. Appris beaucoup de choses! Merci pour l'idée!
df.withColumn("Green_Ind", when($"color" === "Green", 1).when($"color" === "Red", 1).otherwise(0))
join
, que si les données est énorme, oui, il est possible d'utiliser la diffusion de rejoindre pour la première DF si.Solution efficace qui ne nécessite pas cher groupement:
Vous sont conditionnellement à jour le DataFrame si elle satisfait à une certaine propriété. Dans ce cas, la propriété est "la couleur de la colonne contient "rouge"". Le idiomatiques façon de l'exprimer est de filtrer le prédicat et, ensuite, de déterminer si les lignes de la satisfaire. Il n'est pas nécessaire pour une jointure.
Car il pourrait y avoir quelques lignes dans filtré dataframe, je suis en ajoutant de la solution avec
isin()
et.withColumn()
combinaison.Échantillon DataFrame
Maintenant, nous allons choisir seulement
dept
s qui ont au moins un rougecolor
ligne et de le placer dansbroadcast
variable comme ci-dessous.Mise à jour rouge couleur pour filtrée
depts
enregistrements.Étincelle 2.2.0:
Exemple de Dataframe ( prises à partir des exemples ci-dessus)
créé une fonction pour effectuer la mise à jour par la vérification de l'état.
de sortie:
étincelle 1.6: