#はじめに
Databricksを学んで1か月の筆者が、Pysparkのデータフレームを操作する際に遭遇したエラーとその対応について、実際のコードとともに記載しております。
本記事が、Pysparkを学習する方の参考になれば幸いです。
#本文
####・Attribute Error: 'DataFrame' object has no attribute 'withcolumn'
TestDF = DF.withcolumn("stationary", col("item_name").isin("pencil", "eraser"))
原因:withColumnのCが小文字になっているため。
対処法:cを大文字に直す。
WithColumnに限らず、複数の単語が結合して出来た関数名については、2単語目以降が大文字から始まることが多い。
例:dropDuplicate, orderBy, isNotNull
使用する関数については、あらかじめ公式ドキュメント等で関数名を確かめておくのが無難と思われる。
####・TypeError: 'Column' object is not callable
TestDF = DF.groupBy(col("item_name").count())
原因:関数count()がDataFrameではなくカラムに対して適用しようとしているため。
対処法:groupByの括弧の外側にcount()を配置し、DataFrameへ適用させる。
TestDF = DF.groupBy(col("item_name")).count()
使用する関数がDataFrameに対応するのか、カラムに対応するのかを把握しておくと、関数の配置に迷わないため、上記エラーの減少につながる。
pyspark.sql.DataFrameに掲載されている関数はDataFrameにつながるように配置し、
pyspark.sql.Columnに掲載されている関数はカラムに直接つながるように配置する。
####・IndentationError: unexpected indent
TestDF1 = DF.groupBy("item_name")
.avg("price")
原因:2行目のコードが前行とつながっていないものと判断されるため。
対処法:行末に\
を付けるか、右辺の最初と最後を括弧で囲む。
TestDF1 = DF.groupBy("item_name")\
.avg("price")
TestDF1 = (DF.groupBy("item_name")
.avg("price")
)
特にコードが長くなる場合、使用する関数ごとにインテンドする事でコードが見やすくなるが、上記対応がなされていないとエラーが発生するため、注意が必要である。
####・AttributeError: 'DataFrame' object has no attribute 'avg'
TestDF = (DF.groupBy("item_name")
.sum("price")
.avg("price")
)
原因:2つの集計関数をそのままドットで繋げてしまっているため。
対処法:集計関数をaggメソッドで囲み、コンマ区切りで使用する。
TestDF = (DF.groupBy("item_name")
.agg(sum("items.quantity"), avg("items.item_revenue_in_usd"))
)
集計結果のカラムに別名(alias
)を付ける際や、複数の集計関数を使用したい場合にagg
メソッドが有効である。