gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:29:43 26 4
gpt4 key购买 nike

我来自 pandas 背景,习惯于将 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

最佳答案

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

  • 选项 1. 使用 selectExpr .

     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|
    #+-------+---+

关于python - 如何更改 PySpark 中的数据框列名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34077353/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com