Pyspark:获取时间窗口之间的行数

Pyspark:获取时间窗口之间的行数,pyspark,Pyspark,我有一些这种格式的数据: 用户id |日期|应用程序|已打开 123 | 2018-09-01 | 1 123 | 2018-09-01 | 1 123 | 2018-09-01 | 1 234 | 2018-08-23 | 1 234 | 2018-08-23 | 1 234 | 2018-08-21 | 1 234 | 2018-08-10 | 1 我正在尝试获取一天内打开的应用程序数,以及从当天开始的上周打

我有一些这种格式的数据:

用户id |日期|应用程序|已打开 123 | 2018-09-01 | 1 123 | 2018-09-01 | 1 123 | 2018-09-01 | 1 234 | 2018-08-23 | 1 234 | 2018-08-23 | 1 234 | 2018-08-21 | 1 234 | 2018-08-10 | 1 我正在尝试获取一天内打开的应用程序数,以及从当天开始的上周打开的应用程序数

这是我所需的输出:

用户id |日期|应用程序|打开|应用程序|打开|日|应用程序|打开|周 123 | 2018-09-01 | 1 | 1 | 1 123 | 2018-09-01 | 1 | 2 | 2 123 | 2018-09-01 | 1 | 3 | 3 234 | 2018-08-23 | 1 | 1 | 1 234 | 2018-08-23 | 1 | 2 | 2 234 | 2018-08-21 | 1 | 1 | 3 234 | 2018-08-10 | 1 | 1 | 1 我使用pyspark中的窗口函数来获得所需的输出。我成功获得了应用程序开放日计数,但没有获得正确的应用程序开放周计数

我的问题是:

应用程序开放日 w1=窗口。按“用户id”、“日期”、“应用程序已打开”划分。按“日期”排序。窗口之间的行。无边界接收,0 df=df.selectcol*,F.sum'app\u opened'。overv1.aliasapp\u open\u day 应用程序开放周 天数=λi:i*86400 w2=Window.partitionBy'user\u id'、'date'、'app\u opened'。orderBydate.rangeBetween-days7,0 df=df.选择col*,F.sum'app\u opened'.overv2.aliasapp\u open\u week
我没有达到我错的地方。请帮忙。TIA。

您可以找到应用程序开放周字段的解决方案

>>>导入pyspark.sql.F函数 >>>从pyspark.sql.window导入窗口 >>> >>>df=sc.parallelize[ ... 123,'2018-09-01',1, ... 123,'2018-09-01',1, ... 123,'2018-09-01',1, ... 234,'2018-08-23',1, ... 234,'2018-08-23',1, ... 234,'2018-08-21',1, ... 234,'2018-08-10',1 .toDF['user\u id'、'date'、'app\u opened'] >>> >>>window1=Window.partitionBy'user\u id' >>>df=df.带列'max_date',F.max'date' >>>df=df.withColumn'date_diff',F.datediff.to_date'max_date',F.to_date'date'/7.强制转换为'integer' >>> >>>window2=Window.partitionBy'user\u id','date\u diff'.orderByF.desc'date' >>>df=df.列为'app\u open\u week',F.row\u number.overwindow2.选择'user\u id','date','app\u opened','app\u open\u week' >>> >>>排序[用户id,日期],升序=[1,0]。显示 +----+-----+-----+-------+ |用户标识|日期|应用程序|打开|应用程序|打开|周| +----+-----+-----+-------+ | 123|2018-09-01| 1| 1| | 123|2018-09-01| 1| 2| | 123|2018-09-01| 1| 3| | 234|2018-08-23| 1| 1| | 234|2018-08-23| 1| 2| | 234|2018-08-21| 1| 3| | 234|2018-08-10| 1| 1| +----+-----+-----+-------+
@pissall应用程序开放日对我来说很好,但不是应用程序开放周。为什么要将窗口定义放在括号内?此外,日期列已转换为日期?如果存在2018-08-16、2018-08-17等日期。应用程序开放周是如何工作的?这些天应该涉及哪一组?@AliYesilli我们已经根据日期和用户对数据进行了排序。因此,对于一个用户来说,最新的事务总是第一个。您可以在-7,0之间做一行。我喜欢您的想法,即获得每个用户id和分组的最大日期(自数据差异开始的一周)。但是,当您添加第234行时,例如“2018-08-15”,1,该解决方案不再正确,因为您不会得到从当前日期算起的上周打开的应用程序数,而是从max_日期算起的周数。@pansen我认为如果您添加第234行,“2018-08-15”,1,它会起作用。我用date_diff进行分组周。在计算日期中,差值除以7,结果为0,1,2,3。。等等。如果您在window2中查找ORDERBY子句,它将使用date字段。我希望我能解释清楚,你得到的是自用户id的最大日期起的第0、1、2、3周,而不是从当前日期起的一周。当添加第234行“2018-08-15”,1时,我得到2018-08-10的计数为2,这是不正确的,因为这是第一个没有过去日期可总结的日期。@pansen,有两个星期,第一个是23-22-21-20-19-18-17,第二个是16-15-14-13-12-11-10。因此,如果您添加第234行,'2018-08-15',1,它将属于第二周。第二周将有两排。第234页,'2018-08-15',1页和第234页,'2018-08-10',1页。所以2018-08-10你应该得到2个数字。因为这是预期的结果。我命令大家下楼。如果您想要相反,您应该在windows2中将orderByF.desc'date'更改为orderBy'date'。然后,我将了解您的解决方案是如何工作的。我想说的是,它没有回答OP的要求。不过,我还是喜欢你的方法。