如何更改 PySpark 中的数据框列名称?

新手上路,请多包涵

我来自熊猫背景,习惯于将 CSV 文件中的数据读取到数据框中,然后使用简单的命令将列名更改为有用的名称:

 df.columns = new_column_name_list

但是,这在使用 sqlContext 创建的 PySpark 数据帧中不起作用。我能想到的唯一解决方案是:

 df = sqlContext.read.format("com.databricks.spark.csv").options(header='false', inferschema='true', delimiter='\t').load("data.txt")
oldSchema = df.schema
for i,k in enumerate(oldSchema.fields):
  k.name = new_column_name_list[i]
df = sqlContext.read.format("com.databricks.spark.csv").options(header='false', delimiter='\t').load("data.txt", schema=oldSchema)

这基本上是两次定义变量并首先推断架构,然后重命名列名,然后使用更新的架构再次加载数据框。

有没有更好、更有效的方法来做到这一点,就像我们在 pandas 中所做的那样?

我的 Spark 版本是 1.5.0

原文由 Shubhanshu Mishra 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 707
2 个回答

有很多方法可以做到这一点:

    data = sqlContext.createDataFrame([("Alberto", 2), ("Dakota", 2)],
                                     ["Name", "askdaosdka"])
   data.show()
   data.printSchema()

   # Output
   #+-------+----------+
   #|   Name|askdaosdka|
   #+-------+----------+
   #|Alberto|         2|
   #| Dakota|         2|
   #+-------+----------+

   #root
   # |-- Name: string (nullable = true)
   # |-- askdaosdka: long (nullable = true)

   df = data.selectExpr("Name as name", "askdaosdka as age")
   df.show()
   df.printSchema()

   # Output
   #+-------+---+
   #|   name|age|
   #+-------+---+
   #|Alberto|  2|
   #| Dakota|  2|
   #+-------+---+

   #root
   # |-- name: string (nullable = true)
   # |-- age: long (nullable = true)

  • 选项 2。使用 withColumnRenamed ,请注意此方法允许您“覆盖”同一列。对于 Python3,将 xrange 替换为 range
    from functools import reduce

   oldColumns = data.schema.names
   newColumns = ["name", "age"]

   df = reduce(lambda data, idx: data.withColumnRenamed(oldColumns[idx], newColumns[idx]), xrange(len(oldColumns)), data)
   df.printSchema()
   df.show()

  • 选项 3. 使用 alias ,在 Scala 中您也可以使用 as
    from pyspark.sql.functions import col

   data = data.select(col("Name").alias("name"), col("askdaosdka").alias("age"))
   data.show()

   # Output
   #+-------+---+
   #|   name|age|
   #+-------+---+
   #|Alberto|  2|
   #| Dakota|  2|
   #+-------+---+

  • 选项 4. 使用 sqlContext.sql ,它允许您在注册为表的 DataFrames 上使用 SQL 查询。
    sqlContext.registerDataFrameAsTable(data, "myTable")
   df2 = sqlContext.sql("SELECT Name AS name, askdaosdka as age from myTable")

   df2.show()

   # Output
   #+-------+---+
   #|   name|age|
   #+-------+---+
   #|Alberto|  2|
   #| Dakota|  2|
   #+-------+---+

原文由 Alberto Bonsanto 发布,翻译遵循 CC BY-SA 4.0 许可协议

df = df.withColumnRenamed("colName", "newColName")\
       .withColumnRenamed("colName2", "newColName2")

使用这种方式的优点:对于一长串列,您只想更改几个列名。这在这些场景中非常方便。在连接具有重复列名的表时非常有用。

原文由 Pankaj Kumar 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏