通过开始时间和结束时间获取唯一的ID计数

时间:2019-05-09 07:24:36

标签: python sql dataframe pyspark

我有这个数据框

@tbl2

计算开始日期和结束日期并找到ID的唯一计数的地方

a   NULL
b   NULL
c   NULL

所以唯一用户为2,记录的总数为3

我想使用Date ID 1 A 2 B 3 C 4 D 1 A 2 B 3 C 4 A 1 B 2 A Date Id 1 A 1 A 1 B 以及column Start_date的唯一计数来创建此数据框

End_date

该怎么做?

1 个答案:

答案 0 :(得分:0)

这是解决方案

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