从具有目标列值的列更新 pyspark 数据框
Posted
技术标签:
【中文标题】从具有目标列值的列更新 pyspark 数据框【英文标题】:Update pyspark dataframe from a column having the target column values 【发布时间】:2019-12-30 10:00:04 【问题描述】:我有一个数据框,它有一个列(在本例中为“target_column”),我需要使用“val”列值更新这些目标列。
我尝试过使用 udfs 和 .withcolumn,但它们都希望使用固定的列值。就我而言,它可以是可变的。由于 rdd 是不可变的,因此使用 rdd 映射转换也不起作用。
def test():
data = [("jose_1", 'mase', "firstname", "jane"), ("li_1", "ken", 'lastname', 'keno'), ("liz_1", 'durn', 'firstname', 'liz')]
source_df = spark.createDataFrame(data, ["firstname", "lastname", "target_column", "val"])
source_df.show()
if __name__ == "__main__":
spark = SparkSession.builder.appName('Name Group').getOrCreate()
test()
spark.stop()
输入:
+---------+--------+-------------+----+
|firstname|lastname|target_column| val|
+---------+--------+-------------+----+
| jose_1| mase| firstname|jane|
| li_1| ken| lastname|keno|
| liz_1| durn| firstname| liz|
+---------+--------+-------------+----+
预期输出:
+---------+--------+-------------+----+
|firstname|lastname|target_column| val|
+---------+--------+-------------+----+
| jane| mase| firstname|jane|
| li_1| keno| lastname|keno|
| liz| durn| firstname| liz|
+---------+--------+-------------+----+
例如在输入的第一行中,target_column 是“firstname”,val 是“jane”。所以我需要在该行中用“jane”更新名字。
谢谢
【问题讨论】:
目标列可以取任何值? 这能回答你的问题吗? PySpark- How to use a row value from one column to access another column which has the same name as of the row value target_column 有列名作为值,这些列名应该用相应的 val 列值更新。 例如在输入的第一行中,target_column 是“firstname”,val 是“jane”。所以我需要在该行中用“jane”更新名字。 【参考方案1】:您可以对所有列进行循环:
from pyspark.sql import functions as F
for col in df.columns:
df = df.withColumn(
col,
F.when(
F.col("target_column")==F.lit(col),
F.col("val")
).otherwise(F.col(col))
)
【讨论】:
以上是关于从具有目标列值的列更新 pyspark 数据框的主要内容,如果未能解决你的问题,请参考以下文章
Pyspark/SQL 将具有列表值的列连接到另一个数据框列
如何使用pyspark将具有多个可能值的Json数组列表转换为数据框中的列
python, pyspark : 获取 pyspark 数据框列值的总和