2017-09-08 1 views
0

J'ai l'exemple de trame de données suivant.Ajout d'une nouvelle colonne après la fonction UDF à une trame PySpark existante

+-------+--------+--------+--------+ 
| data1 | data 2 | data 3 | data 4 | 
+-------+--------+--------+--------+ 
|1  |abc  |abd  |3  | 
+-------+--------+--------+--------+ 
|3  |abd  |abd  |3  | 
+-------+--------+--------+--------+ 
|2  |abe  |abg  |2  | 

Je demande une UDF qui convertit des données 4 pour True si 3 et si False 2, par exemple.

J'utilise le code suivant pour générer un dataframe indépendant avec les anciennes et les nouvelles valeurs dans une colonne:

UDF = udf(converterFnc,StringType()) 
tempDF = mydata.select('data 4', UDF('data 4').alias('newdata 4')) 

et obtenir la dataframe suivante:

+--------+-----------+ 
| data 4 | newdata 4 | 
+--------+-----------+ 
| 3  | True  | 
+--------+-----------+ 
| 2  | False  | 

Je suis en train de figure comment fusionner ceci à la trame de données originale, mais je trouve que je reçois un problème étrange en utilisant join dans lequel toutes les valeurs jointes sont juste la première valeur pour l'ensemble de l'image.

Ma sortie souhaitée:

+-------+--------+--------+--------+-----------+ 
| data1 | data 2 | data 3 | data 4 | newdata 4 | 
+-------+--------+--------+--------+-----------+ 
|1  |abc  |abd  |3  | True  | 
+-------+--------+--------+--------+-----------+ 
|3  |abd  |abd  |3  | True  | 
+-------+--------+--------+--------+-----------+ 
|2  |abe  |abg  |2  | False  | 

Merci!

Répondre

1

Vous pouvez utiliser withColumn et when.otherwise pour créer une nouvelle colonne sans le processus joining:

import pyspark.sql.functions as F 
df.withColumn("newdata 4", F.when(df["data 4"] == 3, True).otherwise(F.when(df["data 4"] == 2, False))).show() 
+-----+------+------+------+---------+ 
|data1|data 2|data 3|data 4|newdata 4| 
+-----+------+------+------+---------+ 

| 1| abc| abd|  3|  true| 
| 3| abd| abd|  3|  true| 
| 2| abe| abg|  2| false| 
+-----+------+------+------+---------+ 
+0

Merci! Ma méthode était un peu plus compliquée qu'un simple classificateur 'True/False' mais la méthode' withColumn' m'a permis de le faire fonctionner! – Kam

+0

Cool. Content que ça aide! – Psidom