Apache spark *PySpark*TypeError:int()参数必须是字符串或数字,而不是';列';

Apache spark *PySpark*TypeError:int()参数必须是字符串或数字,而不是';列';,apache-spark,pyspark,apache-spark-sql,jupyter-notebook,data-analysis,Apache Spark,Pyspark,Apache Spark Sql,Jupyter Notebook,Data Analysis,我正在从事这个PySpark项目,当我试图计算一些东西时,我得到以下错误: TypeError:int()参数必须是字符串或数字,而不是“列” 我试着按照这个问题的解决方案来做,但没有成功。无论如何,请在下面找到我的代码。我是PySpark的新手,因此我很乐意向社区寻求帮助 import datetime from dateutil.relativedelta import relativedelta start_month =( df .select('client_

我正在从事这个PySpark项目,当我试图计算一些东西时,我得到以下错误:

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

我试着按照这个问题的解决方案来做,但没有成功。无论如何,请在下面找到我的代码。我是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")))
                   )
)

这是因为要将列类型传递给relativedelta函数,df['months\u since\u 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())))
                  )

虽然我没有对它进行测试,但这会给你一个想法。

如果目标是从当前日期减去天数,其中天数存储在另一列中,我可以想到以下近似解决方案:

from pyspark.sql.functions import expr

df.withColumn("acquisition_month", expr("date_sub(current_date, months_since_act * 30 )"))
从某种意义上讲,它是近似的,一个月正好有30天


您得到的错误是因为
relativedelta
要求参数为整数,但您正在传递一列
df['months\u since\u act']

您确定这是您的全部代码吗?因为这里没有调用
int
!这不是全部代码,只是Jupyter中的一个单元格。调用int是什么意思?如果不是整个代码,甚至不是整个相关代码,甚至不是发生错误的那一行,我们应该如何帮助你?这是相关代码,错误发生在最后一行,它到底发生在哪里?谢谢!在'months\u since\u act'列中,我有客户激活其帐户的过去月份数,我正在尝试获取该数据(类型为int)为了计算账户创建的大致日期,我也尝试将其放入该表单中,我得到了相同的错误,我建议您为相同的编辑注释编写udf。添加了UDF示例。这很有帮助,我现在正在努力(y)这就是我想要得到的,你知道有没有什么方法可以给它每个元素的内部数据,而不是一次完整的数据?@MirunaPîrvulescu你说的
给它每个元素的内部数据是什么意思?“对于每个客户id,考虑到今天的日期和账户创建的月数,我如何计算账户激活的日期?”这就是我的意思,抱歉ambiguity@MirunaPîrvulescu我发布的代码应该做到这一点,因为withColumn转换将应用于数据帧的每一行。