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