首页 > 解决方案 > Pyspark 动态转换列

问题描述

我正在使用 Pyspark 并尝试根据现有的输入数据框生成输出数据框

假设有一个数据框 df1 包含以下列

Key1, Key2, src_Col1, src_Col2, src_Col3, tgt_Col1, tgt_Col2, tgt_Col3, field_diff

示例数据:

"a", 2, "x2", "y2", "z2", "x21", "y21", "z2", "col1" 
"a", 2, "x2", "y2", "z2", "x21", "y21", "z2", "col2"
"a", 3, "x3", "y3", "z3", "x3", "y3", "z31", "col3"

根据这个例子,第一行有 field_diff = "col1" ,这意味着列 src_col1 和 tgt_col1 不同。同样第二行有 field_diff = "col2" ,这意味着列 src_col2 和 tgt_col2 不同

使用这个数据框,我需要生成一个新的数据框,看起来像

key1, key2, field_diff, src_value, tgt_value
"a", 2, "col1", "x2", "x21"
"a", 2, "col2", "y2", "y21"
"a", 3, "col3", "z3", "z31"

如何将列“src_value”添加到 df1,它将包含第一行的列 src_col1 的值?即如何使用 df1.field_diff 中存在的列名来引用列值

请注意,我无法对列名进行硬编码,因为此逻辑将用于任何表名

我尝试使用以下语法,但似乎不正确

df2=df1.withColumn("SrcValue", lit(df1.select(col("src_"+df1.field_diff))))

标签: pyspark

解决方案


推荐阅读