Pyspark:用字典中的值替换列的值
Posted
技术标签:
【中文标题】Pyspark:用字典中的值替换列的值【英文标题】:Pyspark: Replace value of a column with a value in the dictionary 【发布时间】:2021-08-26 11:29:34 【问题描述】:我有一个包含 3 列的数据框 df
:
+---+---------+---------+
| 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匹配。
到目前为止,我已经尝试过这段代码。
UDF获取key的值:
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?
先谢谢你。
【问题讨论】:
【参考方案1】:我认为不需要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|
#+---+--------+--------+
【讨论】:
知道了,我试试! data_list 实际上包含有 6 个键(不是 3 个)的字典。在将列表转换为数据框之前,我定义了列名:list_columns = ['id', 'key_1', .... ]
并在此 df_list 中创建了一个数据框:df_list = session.createDataFrame(data = data_list, schema = list_columns)
,id 列显示第 4 列的值,最后一列显示 id 列的值。我不明白为什么列名正确但值混淆(错误顺序)
用示例数据更新问题,将研究问题!以上是关于Pyspark:用字典中的值替换列的值的主要内容,如果未能解决你的问题,请参考以下文章
用列表 Pyspark Dataframe 中的值替换 NA