在pyspark中交换列值

时间:2019-01-29 19:08:23

标签: apache-spark pyspark apache-spark-sql

我在Spark中有以下数据框

s s_type o o_type
-----------------  
s1 ss1  o1   oo1   
s2 ss2  o2   oo2

我想交换列

 s s_type o o_type
 -----------------  
 o1 oo1  s1   ss1   
 o2 oo2  s2   ss2

一种方法是将列[o, o_type]复制到临时列['o_temp','o_type_temp']中 然后将[s,s_type]的值复制到[o,o_type],最后将['o_temp','o_type_temp']复制到[s,s_type]

我想知道是否有更好/更有效的方法?

1 个答案:

答案 0 :(得分:2)

您可以将selectpyspark.sql.Column.alias一起使用:

from pyspark.sql.functions import col
df = df.select(
    col("o").alias("s"),
    col("o_type").alias("s_type"),
    col("s").alias("o"),
    col("s_type").alias("o_type")
)

对于更通用的解决方案,您可以创建旧名称到新名称的映射,并在列表理解中对其进行循环:

# key = old column, value = new column
mapping = {
    "o": "s",
    "o_type": "s_type",
    "s": "o",
    "s_type": "o_type"
}

df = df.select(*[col(old).alias(new) for old, new in mapping.items()])