Я считаю, что вам не нужно использовать Window
для достижения того, что вы хотите.Это может понадобиться, например, если вы хотите получить агрегацию дней перед каждой датой.В вашем примере вам может быть достаточно просто проанализировать столбец datetime
и использовать его в операторе groupBy
.Рабочий пример приведен ниже, надеюсь, это поможет!
import pyspark.sql.functions as psf
df = sqlContext.createDataFrame(
[
('NO2','aq_monitor914','2018-10-07 23:15:00',0.9945200000000001),
('NO2','aq_monitor914','2018-10-07 23:30:00',1.1449200000000002),
('NO2','aq_monitor914','2018-10-07 23:45:00',1.13176),
('NO2','aq_monitor914','2018-10-08 00:00:00',0.9212),
('NO2','aq_monitor914','2018-10-08 00:15:00',1.39872),
('NO2','aq_monitor914','2018-10-08 00:30:00',1.51528)
],
("Variable","Sensor Name","Timestamp","Value")
)
df = df.withColumn('Timestamp',psf.to_timestamp("Timestamp", "yyyy-MM-dd HH:mm:ss"))
df.show()
magic_percentile = psf.expr('percentile_approx(Value, 0.5)')
df_agg = df.groupBy('Variable','Sensor Name',psf.to_date('Timestamp').alias('Day')).agg(magic_percentile.alias('Value'))
df_agg.show()
Ввод:
+--------+-------------+-------------------+------------------+
|Variable| Sensor Name| Timestamp| Value|
+--------+-------------+-------------------+------------------+
| NO2|aq_monitor914|2018-10-07 23:15:00|0.9945200000000001|
| NO2|aq_monitor914|2018-10-07 23:30:00|1.1449200000000002|
| NO2|aq_monitor914|2018-10-07 23:45:00| 1.13176|
| NO2|aq_monitor914|2018-10-08 00:00:00| 0.9212|
| NO2|aq_monitor914|2018-10-08 00:15:00| 1.39872|
| NO2|aq_monitor914|2018-10-08 00:30:00| 1.51528|
+--------+-------------+-------------------+------------------+
Ввод:
+--------+-------------+----------+-------+
|Variable| Sensor Name| Day| Value|
+--------+-------------+----------+-------+
| NO2|aq_monitor914|2018-10-07|1.13176|
| NO2|aq_monitor914|2018-10-08|1.39872|
+--------+-------------+----------+-------+