😊

PySparkのcol関数の引数について

2022/04/24に公開

モチベーション

col("columnName")で指定されたcolumnNameの意味がわからなかったので確認した。

https://spark.apache.org/docs/latest/api/python/reference/api/pyspark.sql.functions.col.html

結果

下記のリンクにあるように、col("columnName") と指定した場合には、まだDataFrameとの関連付けがされていないcolの状態である。(A generic column no yet associated with a DataFrame.)
https://spark.apache.org/docs/2.0.0/api/java/org/apache/spark/sql/Column.html

そこでWithcolumnメソッドなどの引数で使われた場合に、はじめてDataFrameとの関連付けが行われDataFrameの該当するカラムを得ることになる。
なお、colのカラム名をDataFrameのカラム名から見つけることができなかった場合に、AnalysisException: cannot resolve 'colname' given input columns:
となる。

from pyspark.sql.functions import col

df = df.withColumn('new_column_name', col("columnName"))

なお、余談であるが、リテラルのColumnオブジェクトを生成する場合には、lit関数を用いる。
https://spark.apache.org/docs/3.1.1/api/python/reference/api/pyspark.sql.functions.lit.html

from pyspark.sql.functions import lit

data = [('Alice', 13,),('Bob',17),('Taro',25)]
df = spark.createDataFrame(data,['name', 'age'])
df.show()

df = df.withColumn('newcol',lit('hoge'))
df.show()

+-----+---+
| name|age|
+-----+---+
|Alice| 13|
|  Bob| 17|
| Taro| 25|
+-----+---+

+-----+---+------+
| name|age|newcol|
+-----+---+------+
|Alice| 13|  hoge|
|  Bob| 17|  hoge|
| Taro| 25|  hoge|
+-----+---+------+

Discussion