PySparkでデータフレームの列名を変更するにはどうすればいいですか? 質問する

PySparkでデータフレームの列名を変更するにはどうすればいいですか? 質問する

私は 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)

これは基本的に、変数を 2 回定義し、最初にスキーマを推測してから列名を変更し、更新されたスキーマでデータフレームを再度ロードします。

パンダのように、これを実行するためのより優れた効率的な方法はありますか?

私のSparkのバージョンは1.5.0です

ベストアンサー1

それには多くの方法があります:

  • オプション1. 使用選択式

     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. 使用列名を変更、このメソッドを使用すると、同じ列を「上書き」できることに注意してください。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. 使用エイリアスScalaでは次のようにも使えますとして

     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. 使用sqlコンテキスト.sql、テーブルとして登録された SQL クエリを使用できるようになりますDataFrames

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

おすすめ記事