事象
- 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| +----+----------+----+----------+
参考
PySpark – TypeError: Column is not iterable - Spark by {Examples}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()