#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? Есть ли какая-либо причина, по которой это невозможно сделать без него?