我有这个数据框
Date ID
1 A
2 B
3 C
4 D
1 A
2 B
3 C
4 A
1 B
2 A
在其中计算开始日期和结束日期并找到 ID 的唯一计数它只是一个人来是日期 1 和 end_date 是 1 是:
Date Id
1 A
1 A
1 B
所以唯一用户是2,记录总数是3
我想用column Start_date
和End_date
和唯一计数来创建这个数据框ID
Start_date End_date Unique
1 1 3
1 2 2
1 3 3
1 4 4
2 2 2
2 3 3
2 4 4
3 3 1
3 4 3
4 4 2
怎么做?
这是解决方案
import pyspark.sql.functions as F
from pyspark.sql.types import ArrayType,IntegerType
def date_ranges(start_date,end_date):
return list(range(start_date,end_date+1))
date_ranges_udf = F.udf(date_ranges, ArrayType(IntegerType()))
df = spark.createDataFrame(
[(1,'A'),(2,'B'),(3,'C'),(4,'D'),(1,'A'),
(2,'B'),(3,'C'),(4,'A'), (1,'B'),(2,'A')], ["Date", "ID"])
df_start_end_dates = df.select(
F.min(F.col('Date')).alias('min_date'),F.max(F.col('Date')).alias('max_date')
).withColumn('start_date',F.col('min_date')).select(
'start_date',
F.explode(
date_ranges_udf(F.col('min_date'),F.col('max_date'))
).alias('end_date')
)
cond = [F.col('Date') >= F.col('start_date'), F.col('Date') <= F.col('end_date')]
df_start_end_dates.join(
df,cond
).groupBy(
'start_date','end_date'
).agg(
F.countDistinct('ID').alias('Unique')
).orderBy(
'start_date','end_date'
).show()
结果
+----------+--------+------+
|start_date|end_date|Unique|
+----------+--------+------+
| 1| 1| 2|
| 1| 2| 2|
| 1| 3| 3|
| 1| 4| 4|
+----------+--------+------+
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句