Округление часов даты и времени в PySpark - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь округлить часы, используя pyspark и udf.

Функция работает правильно на python, но не очень хорошо при использовании pyspark.

Ввод:

date = Timestamp('2016-11-18 01:45:55') # type is pandas._libs.tslibs.timestamps.Timestamp

def time_feature_creation_spark(date):
    return date.round("H").hour

time_feature_creation_udf = udf(lambda x : time_feature_creation_spark(x), IntegerType())

enter image description here

Затем я использую его в функции, которая подает искру:

data = data.withColumn("hour", time_feature_creation_udf(data["date"])

И ошибка:

TypeError: объект 'Column' не может быть вызван

Ожидаемый результат - только ближайший час от времени в datetime (например, 20h45 ближе всего к 21h, поэтому возвращает 21)

1 Ответ

0 голосов
/ 13 декабря 2018

Вы не можете просто применить 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")))

Что она делает:

  1. конвертирует timestamp в unix время в секундах, используя unix_timestamp()
  2. разделите его на 3600 часов, округлите его и умножьте 3600 обратно
  3. приведите время unix к нормальной метке времени, используя cast()
  4. , извлеките час, используя hour() функция

Spark использует свои собственные типы данных, поэтому pandas._libs.tslibs.timestamps.Timestamp будет преобразовано в pyspark.sql.types.TimestampType, когда вы преобразуете кадр данных pandas в spark, поэтому функции pandas больше не будут работать.

...