【问题标题】:*PySpark* TypeError: int() argument must be a string or a number, not 'Column'*PySpark* TypeError: int() 参数必须是字符串或数字,而不是“列”
【发布时间】:2019-10-23 11:04:59
【问题描述】:

我正在处理这个 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")))
                   )
)

【问题讨论】:

  • 你确定这是你的全部代码吗?因为这里没有int的电话!
  • 这不是整个代码,它只是 Jupyter 中的一个单元格。调用 int 是什么意思?
  • 嗯...如果不是整个代码,甚至不是整个相关代码,甚至不是发生错误的行,我们应该如何帮助您?
  • 这是相关代码,错误出现在最后一行
  • 具体发生在哪里?

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


【解决方案1】:

这是因为您将 Column Type 传递给 relativedelta 函数,df['months_since_act'] 返回 Column 类型,而不是 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())))
                  )

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

【讨论】:

  • 谢谢!在“months_since_act”列中,我有过去客户激活其帐户的月数,我正在尝试获取该数据(类型为 int)来计算创建帐户的大致日期跨度>
  • 我也试过把它放在那个表格里,我得到了同样的错误
  • 我建议你也写 udf。
  • 已编辑评论。添加了 UDF 示例。
  • 这很有帮助,我现在正在努力解决(y)
【解决方案2】:

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

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']。

【讨论】:

  • 这就是我想要得到的地方,你知道是否有任何方法可以为每个元素提供内部数据,而不是一次提供整个数据?
  • @MirunaPîrvulescu give it the data inside for every element 是什么意思?
  • "对于每个 client_id,在给定今天的日期和创建帐户的几个月前,我如何计算帐户的激活日期?"
  • 这就是我的意思,很抱歉含糊不清
  • @MirunaPîrvulescu 我发布的代码应该这样做,因为 withColumn 转换将应用于 DataFrame 的每一行。
猜你喜欢
  • 2014-02-26
  • 2013-12-30
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 2023-02-18
  • 2017-07-06
  • 1970-01-01
相关资源
最近更新 更多