Date 如何计算pyspark函数中不同日期范围的id?
我有一个名为h2_df的pyspark数据框架,其中包含“parsed_date”(dtype:date)和“id”(dtype:bigint)列,如下所示:Date 如何计算pyspark函数中不同日期范围的id?,date,apache-spark,pyspark,count,apache-spark-sql,Date,Apache Spark,Pyspark,Count,Apache Spark Sql,我有一个名为h2_df的pyspark数据框架,其中包含“parsed_date”(dtype:date)和“id”(dtype:bigint)列,如下所示: +-------+-----------+ | id|parsed_date| +-------+-----------+ |1471783| 2017-12-18| |1471885| 2017-12-18| |1472928| 2017-12-19| |1476917| 2017-12-21| |1477469| 2017-1
+-------+-----------+
| id|parsed_date|
+-------+-----------+
|1471783| 2017-12-18|
|1471885| 2017-12-18|
|1472928| 2017-12-19|
|1476917| 2017-12-21|
|1477469| 2017-12-22|
|1478190| 2017-12-22|
|1478570| 2017-12-22|
|1481415| 2017-12-25|
|1472592| 2017-12-19|
|1474023| 2017-12-20|
+-------+-----------+
我想创建一个传递日期的函数,在该函数中,我想计算位于日期范围之间的每个日期的id(从函数外部创建的dataframe h2_df)。范围1是(天,天+t),范围2是(天+t,天+(2*t),t=5
我是pyspark的新手,因此下面的代码当然是模糊的,不起作用:
def hypo_2(day):
t = td(days=5)
start_date_before = day
end_date_before = day+t
start_date_after = day+t
end_date_after = day+(2*t)
cond_1 = (h2_df["parsed_date"] > start_date_before) & (h2_df["parsed_date"] < end_date_before)
cond_2 = (h2_df["parsed_date"] > start_date_after) & (h2_df["parsed_date"] < end_date_after)
df_1 = h2_df.withColumn("count_before", when(cond_1, h2_df.groupBy("parsed_date").agg(count("id"))))
df_2 = h2_df.withColumn("count_after", when(cond_2, h2_df.groupBy("parsed_date").agg(count("id"))))
请提供帮助。您可以使用筛选器选择感兴趣的时间间隔,并为每个
解析的日期添加一列计数
:
从pyspark.sql导入函数为F,窗口
def hypo_2(df,日,t):
"""
用法示例:df_list=hypo_2(df,'2017-12-18',5)
返回2个数据帧的列表。
"""
df1=(df.filter(f“在{day}和{day}之间解析的_日期+间隔{t}天”)
.withColumn('count_before',F.count('id')。over(Window.partitionBy('parsed_date'))
.orderBy('parsed_date')
)
df2=(df.filter(f“在{day}+间隔{t}天和{day}+间隔{t*2}天之间解析的_日期”)
.withColumn('count\u after',F.count('id')。over(Window.partitionBy('parsed\u date'))
.orderBy('parsed_date')
)
返回[df1,df2]
为什么count\u在第一行的前面是2?不应该是6,因为所有的行都在5天之内吗?Hello@SameekshaSohal,这是你已经问过的同一个问题的精确副本,因为不够清晰,所以关闭了。请花点时间查看和编辑你的问题,使其他人更容易理解。@mck t感谢您的关注。前面的计数在第一行是2,因为我们可以在2017-12-18上看到2个id,在2017-12-19上看到1个id,以此类推。这是范围1,即(2017-12-18,2017-12-23)。我不需要整个范围内的id总数。我只需要范围内每个日期的id总数。@Blackishop感谢您共享此引用。我也是pyspark和stack overflow的新手。我正在尝试将查询优化到最佳状态。我真的希望得到一些帮助。我希望这次的问题陈述是全面的。谢谢:)@SameekshaSohal那么,为什么原始数据帧的最后两行没有包括在内?另外,如果我没有一天,但是有一个天数列表(以及df和t),我想通过这个函数,是否可能?还是应该在函数内部使用for循环?提前谢谢。@SameekshaSohal我不确定我是否理解你的要求。请打开另一个问题,并提供所有必要的细节。谢谢:)
+-------+-----------+------------+
| id|parsed_date|count_before|
+-------+-----------+------------+
|1471783| 2017-12-18| 2|
|1471885| 2017-12-18| |
|1472928| 2017-12-19| 1|
|1476917| 2017-12-21| 1|
|1477469| 2017-12-22| 3|
|1478190| 2017-12-22| |
|1478570| 2017-12-22| |
+-------+-----------+------------+