5
1

More than 1 year has passed since last update.

PysparkのDataFrame操作に関するエラー対応

Last updated at Posted at 2022-01-05

はじめに

Databricksを学んで1か月の筆者が、Pysparkのデータフレームを操作する際に遭遇したエラーとその対応について、実際のコードとともに記載しております。
本記事が、Pysparkを学習する方の参考になれば幸いです。

本文

・Attribute Error: 'DataFrame' object has no attribute 'withcolumn'

Pyspark
TestDF = DF.withcolumn("stationary", col("item_name").isin("pencil", "eraser"))

原因:withColumnのCが小文字になっているため。
対処法:cを大文字に直す。

WithColumnに限らず、複数の単語が結合して出来た関数名については、2単語目以降が大文字から始まることが多い。
例:dropDuplicate, orderBy, isNotNull

使用する関数については、あらかじめ公式ドキュメント等で関数名を確かめておくのが無難と思われる。

・TypeError: 'Column' object is not callable

Pyspark
TestDF = DF.groupBy(col("item_name").count())

原因:関数count()がDataFrameではなくカラムに対して適用しようとしているため。
対処法:groupByの括弧の外側にcount()を配置し、DataFrameへ適用させる。

Pyspark
TestDF = DF.groupBy(col("item_name")).count()

使用する関数がDataFrameに対応するのか、カラムに対応するのかを把握しておくと、関数の配置に迷わないため、上記エラーの減少につながる。
pyspark.sql.DataFrameに掲載されている関数はDataFrameにつながるように配置し、
pyspark.sql.Columnに掲載されている関数はカラムに直接つながるように配置する。

・IndentationError: unexpected indent

Pyspark
TestDF1 = DF.groupBy("item_name")
            .avg("price")

原因:2行目のコードが前行とつながっていないものと判断されるため。
対処法:行末に\を付けるか、右辺の最初と最後を括弧で囲む。

Pyspark
TestDF1 = DF.groupBy("item_name")\
            .avg("price")
Pyspark
TestDF1 = (DF.groupBy("item_name")
             .avg("price")
          )

特にコードが長くなる場合、使用する関数ごとにインテンドする事でコードが見やすくなるが、上記対応がなされていないとエラーが発生するため、注意が必要である。

・AttributeError: 'DataFrame' object has no attribute 'avg'

Pyspark
TestDF = (DF.groupBy("item_name")
            .sum("price")
            .avg("price")
          )

原因:2つの集計関数をそのままドットで繋げてしまっているため。
対処法:集計関数をaggメソッドで囲み、コンマ区切りで使用する。

Pyspark
TestDF = (DF.groupBy("item_name")
            .agg(sum("items.quantity"), avg("items.item_revenue_in_usd"))
         )

集計結果のカラムに別名(alias)を付ける際や、複数の集計関数を使用したい場合にaggメソッドが有効である。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1