1. ホーム
  2. パイソン

[解決済み】pysparkでデータフレームの列名を変更する方法は?

2022-04-02 07:36:51

質問

私はpandas出身で、CSVファイルからデータをdataframeに読み込み、simpleコマンドを使って列名を有用なものに変更することに慣れています。

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回定義し、最初にスキーマを推測してからカラム名を変更し、更新されたスキーマでデータフレームを再度ロードしています。

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では、次のように置き換えます。 xrangerange .

     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. 使用方法 sqlContext.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|
     #+-------+---+