将UDF后的新列附加到现有PySpark数据帧

时间:2017-09-08 15:15:29

标签: python dataframe merge pyspark bigdata

我有以下示例数据框。

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

我正在应用一个UDF,将数据4转换为True(如果为3),False(例如2)。

我使用以下代码生成一个独立的DataFrame,其中包含列中的旧值和新值:

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

并获取以下DataFrame:

+--------+-----------+
| 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 个答案:

答案 0 :(得分:1)

您可以使用withColumnwhen.otherwise创建一个没有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|
+-----+------+------+------+---------+