我正在从事这个PySpark项目,当我尝试计算某些东西时,出现以下错误:
TypeError:int()参数必须是字符串或数字,而不是“列”
我尝试遵循another post的解决方案来解决此问题,但对我而言却没有奏效。无论如何,请在下面找到我的代码。我对PySpark并不陌生,因此我想向社区寻求帮助。
import datetime
from dateutil.relativedelta import relativedelta
start_month =(
df
.select('client_id')
.withColumn("acquisition_month",
(datetime.datetime.today() - relativedelta(months = (df['months_since_act']).cast("integer")))
)
)
答案 0 :(得分:1)
这是因为要将列类型传递给relativedelta函数,所以df ['months_since_act']返回列类型,而不是int
relativedelta(months = (df['months_since_act']).cast("integer"))
我不确定您要实现什么目标。
但是,当在spark中将列类型转换为整数时,语法应如下所示
relativedelta(months = (df['value'].cast(IntegerType())))
UDF示例-
def getDelta(month):
return datetime.datetime.today() - relativedelta(months = month)
delta = udf(lambda z: getDelta(z), IntegerType())
start_month =(
df.select('client_id')
.withColumn("acquisition_month",delta(df['months_since_act'].cast(IntegerType())))
)
虽然我没有进行测试,但这会给你一个想法。
答案 1 :(得分:0)
如果目标是从当前日期中减去天数(在另一列中存储了天数),我可以想到这种近似解决方案:
from pyspark.sql.functions import expr
df.withColumn("acquisition_month", expr("date_sub(current_date, months_since_act * 30 )"))
从某种意义上讲,它可以将一个月精确地视为30天。
您得到的错误是因为relativedelta
期望参数为整数,但是您正在传递列df['months_since_act']
。