Я надеюсь, что вы мне поможете: -)
У меня есть датафрейм с опубликованным объявлением.Я хочу, чтобы для каждого идентификатора рекламы было подсчитано количество объявлений, опубликованных за 2 месяца, предшествовавших этому, по одному и тому же адресу электронной почты.
Я создал нижеприведенный кадр данных, чтобы лучше объяснить:
var df = sc.parallelize(Array(
(1, "2017-06-29 10:53:53.0","boulanger.fr" ,"2017-06-28","2017-04-29"),
(2, "2017-07-05 10:48:57.0","patissier.fr","2017-07-04","2017-05-05"),
(3, "2017-06-28 10:31:42.0","boulanger.fr" ,"2017-08-16","2017-06-17"),
(4, "2017-08-21 17:31:12.0","patissier.fr","2017-08-20","2017-06-21"),
(5, "2017-07-28 11:22:42.0","boulanger.fr" ,"2017-08-22","2017-06-23"),
(6, "2017-08-23 17:03:43.0","patissier.fr","2017-08-22","2017-06-23"),
(7, "2017-08-24 16:08:07.0","boulanger.fr" ,"2017-08-23","2017-06-24"),
(8, "2017-08-31 17:20:43.0","patissier.fr","2017-08-30","2017-06-30"),
(9, "2017-09-04 14:35:38.0","boulanger.fr" ,"2017-09-03","2017-07-04"),
(10, "2017-09-07 15:10:34.0","patissier.fr","2017-09-06","2017-07-07"))).toDF("id_advert", "creation_date",
"email", "date_minus1","date_minus2m")
df = df.withColumn("date_minus1", to_date(unix_timestamp($"date_minus1", "yyyy-MM-dd").cast("timestamp")))
df = df.withColumn("date_minus2", to_date(unix_timestamp($"date_minus2", "yyyy-MM-dd").cast("timestamp")))
df = df.withColumn("date_crecreation", (unix_timestamp($"creation_date", "yyyy-MM-dd HH:mm:ss").cast("timestamp")))
- date_minus1 = за день до публикации объявления
- date_minus2m = за 2 месяца до размещения объявления
Я хочу подсчитать количество объявлений с помощьютот же адрес электронной почты, между этими двумя датами ...
В результате я хочу получить следующее:
+---------+----------------+
|id_advert|nb_prev_advert |
+---------+----------------+
|6 |2 |
|3 |3 |
|5 |3 |
|9 |2 |
|4 |1 |
|8 |3 |
|7 |3 |
|10 |3 |
+--------+-----------------+
Мне удается сделать это с помощью отдельного соединения с фреймом данных, но ямиллионы строк потребовалось почти 2 часа для запуска ...
Я уверен, что мы можем сделать что-то вроде:
val w = Window.partitionBy("id_advert").orderBy("creation_date").rowsBetween(-50000000, -1)
И использовать его для перехода по фрейму данных и только для подсчетастрока с
- адресом электронной почты для строки = адрес электронной почты для текущей строки
- date_minus2m для строки <дата создания текущей строки <date_minus1 для строки </li>