Вы не можете просто применить pyspark udf к кадру данных pandas.
Если вы хотите выполнить это преобразование в искре, вам нужно сначала преобразовать кадр данных pandas в кадр данных искры.
date1 = Timestamp('2016-11-18 01:45:55')
date2 = Timestamp('2016-12-18 01:45:55')
df = pd.DataFrame({"date": [date1, date2]})
data = sqlContext.createDataFrame(df)
Затем, чтобы вычислить округленный час, вы ненужен UDF.Эта строка сделает трюк.
result = data.withColumn("hour", hour((round(unix_timestamp("date")/3600)*3600).cast("timestamp")))
Что она делает:
- конвертирует
timestamp
в unix время в секундах, используя unix_timestamp()
- разделите его на 3600 часов, округлите его и умножьте 3600 обратно
- приведите время unix к нормальной метке времени, используя
cast()
- , извлеките час, используя
hour()
функция
Spark использует свои собственные типы данных, поэтому pandas._libs.tslibs.timestamps.Timestamp
будет преобразовано в pyspark.sql.types.TimestampType
, когда вы преобразуете кадр данных pandas в spark, поэтому функции pandas больше не будут работать.