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|
+-----------------+----+-----+