我这样做正确吗? 我有一个时间戳列,可以将其转换为每月的第一天。
df= df.withColumn("monthlyTransactionDate", f.trunc(df[transactionDate], 'mon').alias('month'))
然后运行此代码,因为我想生成最小日期和最大日期之间的所有可能月份:
import pyspark.sql.functions as f
minDate, maxDate = df.select(f.min("MonthlyTransactionDate"), f.max("MonthlyTransactionDate")).first()
df.withColumn("monthsDiff", f.months_between(maxDate, minDate))\
.withColumn("repeat", f.expr("split(repeat(',', monthsDiff), ',')"))\
.select("*", f.posexplode("repeat").alias("date", "val"))\
.withColumn("date", f.expr("add_months(minDate, date)"))\
.select('date')\
.show(n=50)
但是在上一节的开头出现错误:
TypeError: Invalid argument, not a string or column: 2016-12-01 of type <type 'datetime.date'>. For column literals, use 'lit', 'array', 'struct' or 'create_map' function.
答案 0 :(得分:0)
在这里
minDate, maxDate = df.select(f.min("MonthlyTransactionDate"), f.max("MonthlyTransactionDate")).first()
返回日期格式的最小和最大日期值。要对所有行使用确切的值,请使用lit() from functions
df.withColumn("monthsDiff", f.months_between(f.lit(maxDate), f.lit(minDate)))