2017-09-08 16 views
0

私は次のデータフレームの例を持っています。既存のPySparkデータフレームにUDFの後に新しい列を追加する

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

Iは、例えば、2あれば3及びFalse場合Trueへのデータ4を変換するUDFを適用しています。

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

と、次のデータフレーム取得:

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

を私は把握しようとしています私は、列の古い値と新しい値を持つ独立したデータフレームを生成するには、次のコードを使用しています

これを元のデータフレームにマージする方法を説明しますが、結合された値のすべてがデータフレーム全体の最初の値になっているjoinを使用すると奇妙な問題が発生することがわかりました。

マイ所望の出力:

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

ありがとうございました!

答えて

1

あなたはjoiningプロセスせずに新しい列を作成するwithColumnwhen.otherwiseを使用することができます。

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

感謝を!私の方法は単純な「True/False」分類器よりも複雑ですが、 'withColumn'メソッドを使って動作させることができました。 – Kam

+0

クール。うれしい! – Psidom