ablog

不器用で落着きのない技術者のメモ

date_add で "TypeError: Column is not iterable" が発生する

事象

  • PySpark で、下記のようなカラムがあったとして
| date: Date | days: Int |
|------------|-----------|
| 2022-08-25 | 3         |
| 2022-08-26 | 2         |
| ...        | ...       |

date 列の days 後の日付を出したいが、

df.withColumn(
    'duedate',
    F.date_add(F.col('date'), F.col('days'))
)

とやると、`TypeError: Column is not iterable` になる。

原因

  • date_add の第2引数はリテラル値でないといけないため。

解決策

  • expr を使う。
import pyspark.sql.functions as F
from datetime import date
data = [
  ('row1', date(2022, 8, 24), 4),
  ('row2', date(2022, 8, 25), 5),
  ('row3', date(2022, 8, 26), 6)
]
df = sqlContext.createDataFrame(data, ['name', 'date', 'days'])
df.show(truncate=False)
from pyspark.sql.functions import expr
df = df.withColumn('duedate', expr("date_add(date, days)"))
df.show()

+----+----------+----+----------+
|name|      date|days|   duedate|
+----+----------+----+----------+
|row1|2022-08-24|   4|2022-08-28|
|row2|2022-08-25|   5|2022-08-30|
|row3|2022-08-26|   6|2022-09-01|
+----+----------+----+----------+

参考

Solution for TypeError: Column is not iterable

PySpark add_months() function takes the first argument as a column and the second argument is a literal value. if you try to use Column type for the second argument you get “TypeError: Column is not iterable”. In order to fix this use expr() function as shown below.

df.select(df.date,df.increment,
     expr("add_months(date,increment)")
  .alias("inc_date")).show()
PySpark – TypeError: Column is not iterable - Spark by {Examples}