* PySpark * TypeError: аргумент int () должен быть строкой или числом, а не «столбцом» - PullRequest
0 голосов
/ 23 октября 2019

Я работаю над этим проектом 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")))
                   )
)

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Это потому, что вы передаете тип столбца в относительную функцию, df ['months_since_act'] возвращает тип столбца, а не int

relativedelta(months = (df['months_since_act']).cast("integer"))

Я не уверен, чего именно вы хотите достичь.

Однако синтаксис должен быть таким при приведении типа столбца к целочисленному в искре

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())))
                  )

Хотя я не проверял его, ноэто даст вам представление.

0 голосов
/ 23 октября 2019

Если цель состоит в том, чтобы вычесть количество дней из текущей даты, где количество дней хранится в другом столбце, я могу подумать об этом приблизительном решении:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...