Писпарк: ворчунья в разные дни - PullRequest
0 голосов
/ 05 мая 2020

У меня есть фрейм данных, который выглядит следующим образом:

df.show(5)
+--------------------+-------------------+
|                  ID|                day|
+--------------------+-------------------+
|ff9ff975-b46b-4ec...|2020-03-06 00:00:00|
|8fb35812-9ed4-4d0...|2020-03-06 00:00:00|
|68fafbd3-2bb9-40f...|2020-03-06 00:00:00|
|00649d8b-d254-4b7...|2020-03-06 00:00:00|
|e4a4ab3c-3263-4d4...|2020-03-06 00:00:00|
+--------------------+-------------------+

Я хотел бы подсчитать для каждого пользователя: количество появившихся дней и общее количество появлений.

1 Ответ

2 голосов
/ 05 мая 2020
import pyspark.sql.functions as psf
import pyspark.sql.types as pst

Во-первых, чтобы убедиться, что вы работаете с днем, преобразуйте столбец отметки времени в дату (пропустите этот шаг, если ваш столбец имеет размер DateType)

df = df.withColumn('date', psf.to_date('day', 'yyyy-MM-dd HH:mm:ss'))

Затем

(df.groupBy('ID')
   .agg(psf.sum(psf.lit(1)).alias('nobs'),
                psf.countDistinct(psf.col('day')).alias('ndays')
        )
)

Примечание: в первоначальном предложении использовалось sumDistinct, это было ошибкой; countDistinct следует использовать

Пример

df = spark.createDataFrame([("ff9ff975-b46b-4ec","2020-03-06 00:00:00"),
                           ("ff9ff975-b46b-4ec","2020-03-06 00:00:00")],
                           ['ID','day'])
df = df.withColumn('date', psf.to_date('day', 'yyyy-MM-dd HH:mm:ss'))
(df.groupBy('ID')
   .agg(psf.sum(psf.lit(1)).alias('nobs'),
                psf.countDistinct(psf.col('date')).alias('ndays')
        )
 .show(2)
)
+-----------------+----+-----+
|               ID|nobs|ndays|
+-----------------+----+-----+
|ff9ff975-b46b-4ec|   2|    1|
+-----------------+----+-----+
...