如何在pyspark中更改数据帧列名?

2024-04-20 08:13:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我来自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)

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

有没有更好更有效的方法像我们在熊猫身上做的那样?

我的spark版本是1.5.0


Tags: csv数据namecomformatdfnewread
3条回答
df = df.withColumnRenamed("colName", "newColName")
       .withColumnRenamed("colName2", "newColName2")

使用这种方法的优点:对于长列列表,您只需要更改很少的列名。在这些情况下,这非常方便。当使用重复的列名连接表时非常有用。

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

  • 选择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,注意这个方法允许您“覆盖”同一列。

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

如果要更改所有列名,请尝试df.toDF(*cols)

相关问题 更多 >