Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 如何计算pyspark函数中不同日期范围的id?_Date_Apache Spark_Pyspark_Count_Apache Spark Sql - Fatal编程技术网

Date 如何计算pyspark函数中不同日期范围的id?

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

我有一个名为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-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|            |
+-------+-----------+------------+