Как найти самые ранние и самые поздние даты в DataFrame в операции группировки? - PullRequest
0 голосов
/ 09 мая 2018

У меня есть следующий DataFrame df:

url            user    date                  followers
www.test1.com  A       2017-01-04 05:46:00   45
www.test1.com  B       2017-01-03 10:46:00   10
www.test1.com  C       2017-01-05 05:46:00   11
www.test2.com  B       2017-01-03 17:00:00   10
www.test2.com  A       2017-01-04 15:05:00   45

Для каждого отдельного url мне нужно найти общую сумму followers, user, который имеет самое раннее date, количество уникальных user значений, самое раннее date и последний date.

Вот что я сделал до сих пор:

val wFirstUser = Window.partitionBy($"url",$"user").orderBy($"date".asc)
val result = df
                .groupBy("url")
                .agg(sum("followers")", countDistinct("user"), min("date"), max("date"))
                .withColumn("rn", row_number.over(wFirstUser)).where($"rn" === 1).drop("rn")

Ожидаемый результат:

url            first_user    earliest_date         latest_date           sum_followers   distinct_users
www.test1.com  B             2017-01-03 10:46:00   2017-01-05 05:46:00   66              3
www.test2.com  B             2017-01-04 15:05:00.  2017-01-03 17:00:00   55              2

Но я не могу найти user, у которого есть самый ранний date (т.е. first_user). Может кто-нибудь, пожалуйста, помогите мне?

1 Ответ

0 голосов
/ 09 мая 2018

Вам не нужна функция window . Все, что вам нужно, это создать столбец структуры, чтобы отсортировать его по дате, чтобы найти минимальную дату и соответствующего пользователя , а все остальное, как вы сделали

import org.apache.spark.sql.functions._
val result = df.withColumn("struct", struct("date", "user"))
  .groupBy("url")
  .agg(sum("followers").as("sum_followers"), countDistinct("user").as("distinct_users"), max("date").as("latest_date"), min("struct").as("struct"))
  .select(col("url"), col("struct.user").as("first_user"), col("struct.date").as("earliest_date"), col("latest_date"), col("sum_followers"), col("distinct_users"))

, который должен дать вам

+-------------+----------+-------------------+-------------------+-------------+--------------+
|url          |first_user|earliest_date      |latest_date        |sum_followers|distinct_users|
+-------------+----------+-------------------+-------------------+-------------+--------------+
|www.test1.com|B         |2017-01-03 10:46:00|2017-01-05 05:46:00|66.0         |3             |
|www.test2.com|B         |2017-01-03 17:00:00|2017-01-04 15:05:00|55.0         |2             |
+-------------+----------+-------------------+-------------------+-------------+--------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...