从具有目标列值的列更新 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数组列表转换为数据框中的列

在 pyspark 中查找和删除匹配的列值

python, pyspark : 获取 pyspark 数据框列值的总和

将具有最接近值的列添加到 PySpark Dataframe

Pyspark:如何将现有非空列的元组列表作为数据框中的列值之一返回