Ошибка атрибута: объект ‘datetime.timedelta’ не имеет атрибута ‘_get_object_id’

#pyspark #pyspark-sql

#pyspark #apache-spark-sql

Вопрос:

Пытаюсь создать 30-минутный интервал времени, и я получаю следующую ошибку атрибута:

объект ‘datetime.timedelta’ не имеет атрибута ‘_get_object_id’

Принимаемый столбец называется timestamp и содержит временную метку типа схемы. например

2019-02-01T15:53:44Z

Я не могу понять, почему я получаю ошибку, учитывая, что приведенный ниже код должен иметь возможность использовать временную метку.

     def ceil_dt(dt, delta):
    return dt   (datetime.min - dt) % delta

df = df.withColumn("bucket_timestamp", ceil_dt(df.timestamp, timedelta(minutes=30)))
return df
  

Комментарии:

1. Привет, какую версию pyspark ты используешь?

Ответ №1:

Вам необходимо использовать определяемую пользователем функцию (UDF):

 from pyspark.sql.types import *
from pyspark.sql import functions as f
from pyspark.sql import Row
from datetime import datetime, timedelta

# example DF
date = datetime.strptime('2019-02-01T15:53:44', '%Y-%m-%dT%H:%M:%S')
df = sc.parallelize([Row(timestamp=date)]).toDF()

# define UDF based on OP's function
ceil_dt = (f.udf(lambda dt, delta:  dt   (datetime.min - dt) % timedelta(minutes=delta),
                TimestampType()))

# now apply to timestamp columns
df = df.withColumn("bucket_timestamp", ceil_dt(df.timestamp, f.lit(30)))
  

Комментарии:

1. привет, не могли бы вы объяснить, почему требуется udf? Есть ли какая-либо причина, по которой это невозможно сделать без него?