* PySpark * TypeError:int()参数必须是字符串或数字,而不是“列”

时间:2019-10-23 11:04:59

标签: apache-spark pyspark apache-spark-sql jupyter-notebook data-analysis

我正在从事这个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")))
                   )
)

2 个答案:

答案 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']