首页 > 解决方案 > Pyspark:用字典中的值替换列的值

问题描述

我有一个df包含 3 列的数据框:

+---+---------+---------+
| Id| Column_1| Column_2|
+---+---------+---------+
| 11|c1_value1|c2_value1|
| 22|c1_value2|c2_value2|

和字典列表 - data_list

[
{'id': '11', 'key_1': 123, 'key_2': 456}
{'id': '22', 'key_1': 789, 'key_2': 123}
]

当数据框中的Id和字典中的id匹配时,我想将Column_1列中的值替换为字典中key_1值。

到目前为止,我已经尝试过这段代码。

UDF 获取键的值:

def return_col(id):
    for item in data_list:
        if item['id'] == id:
            return item['key_1']

return_col_UDF = udf(lambda z: return_lat(z))

在数据帧上调用 UDF:

df.select(col('Id'), \
    return_col_udf(col('Id')).alias('Updated_Column')) \
    .show()

但它只替换了 1 列的值。如何更改 2 列的值:Column_1 和 Column_2?

事先谢谢你。

标签: pythonapache-sparkpyspark

解决方案


我不认为udf你有需要dictionary,所以转换dict为数据框然后加入现有的数据框。

Example:

#load dict_list as dataframe
df1=spark.createDataFrame([{'id': '11', 'key_1': 123, 'key_2': 456},{'id': '22', 'key_1': 789, 'key_2': 123}])
df1.show()
#+---+-----+-----+
#| id|key_1|key_2|
#+---+-----+-----+
#| 11|  123|  456|
#| 22|  789|  123|
#+---+-----+-----+


df.show()
#+---+--------+--------+
#| Id|column_1|column_2|
#+---+--------+--------+
#| 11|      c1|      c2|
#| 22|      c1|      c2|
#+---+--------+--------+

df.join(df1,['id']).\
withColumn("column_1",col("key_1")).\
withColumn("column_2",col("key_2")).\
drop(*['key_1','key_2']).\
show()
#+---+--------+--------+
#| Id|column_1|column_2|
#+---+--------+--------+
#| 22|     789|     123|
#| 11|     123|     456|
#+---+--------+--------+

推荐阅读