apache-spark - PySpark - 使用 withColumnRenamed 重命名多个列

标签 apache-spark pyspark apache-spark-sql rename

我想使用 spark withColumnRenamed 函数更改两列的名称。当然,我可以写:

data = sqlContext.createDataFrame([(1,2), (3,4)], ['x1', 'x2'])
data = (data
       .withColumnRenamed('x1','x3')
       .withColumnRenamed('x2', 'x4'))

但我想一步完成(有新名称的列表/元组)。不幸的是,这两者都不是:

data = data.withColumnRenamed(['x1', 'x2'], ['x3', 'x4'])

也不是这个:

data = data.withColumnRenamed(('x1', 'x2'), ('x3', 'x4'))

正在工作。有可能这样做吗?

最佳答案

不能使用单个 withColumnRenamed称呼。

  • 您可以使用 DataFrame.toDF 方法*

    data.toDF('x3', 'x4')
    

    或者

    new_names = ['x3', 'x4']
    data.toDF(*new_names)
    
  • 也可以使用简单的 select 重命名:

    from pyspark.sql.functions import col
    
    mapping = dict(zip(['x1', 'x2'], ['x3', 'x4']))
    data.select([col(c).alias(mapping.get(c, c)) for c in data.columns])
    

  • 同样在 Scala 中,您可以:
  • 重命名所有列:

    val newNames = Seq("x3", "x4")
    
    data.toDF(newNames: _*)
    
  • 从映射重命名 select :

    val  mapping = Map("x1" -> "x3", "x2" -> "x4")
    
    df.select(
      df.columns.map(c => df(c).alias(mapping.get(c).getOrElse(c))): _*
    )
    

    foldLeft + withColumnRenamed
    mapping.foldLeft(data){
      case (data, (oldName, newName)) => data.withColumnRenamed(oldName, newName) 
    }
    


  • * 不要与 RDD.toDF 混淆这不是可变参数函数,并将列名作为列表,

    关于apache-spark - PySpark - 使用 withColumnRenamed 重命名多个列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38798567/

    相关文章:

    apache-spark - Spark 上的 MC-Stan?

    java - Spark : duplicate stages while using join

    postgresql - 将超过 5000 万从 Pyspark df 写入 PostgresQL,最有效的方法

    scala - Spark Dataframe Join - 重复列(非连接列)

    apache-spark - Pyspark DataFrame : Split column with multiple values into rows

    scala - 为什么 from_json 失败并显示 "not found : value from_json"?

    scala - 对 DStream 进行类型参数化

    scala - 为spark rdd元素添加前缀

    apache-spark - Spark (OneHotEncoder + StringIndexer) = FeatureImportance 如何?

    python - 如何从 PySpark 中的字符串获取列表