但是,这在使用 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 许可协议

回复
阅读 272
2 个回答

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

  • 选项 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)
       newColumns = ["name", "age"]
       df = reduce(lambda data, idx: data.withColumnRenamed(oldColumns[idx], newColumns[idx]), xrange(len(oldColumns)), data)
       df.printSchema()
       df.show()
    
        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|
       #+-------+---+
    
        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 许可协议