Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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
Python pyspark中日期范围的计数id_Python_Apache Spark_Date_Pyspark_Count - Fatal编程技术网

Python pyspark中日期范围的计数id

Python pyspark中日期范围的计数id,python,apache-spark,date,pyspark,count,Python,Apache Spark,Date,Pyspark,Count,我有一个pyspark数据框架,其中包含解析为_date(dtype:date)和id(dtype:bigint)的列,如下所示: +-------+-----------+ | id|parsed_date| +-------+-----------+ |1471783| 2017-12-18| |1471885| 2017-12-18| |1472928| 2017-12-19| |1476917| 2017-12-19| |1477469| 2017-12-21| |1478190

我有一个pyspark数据框架,其中包含解析为_date(dtype:date)和id(dtype:bigint)的列,如下所示:

+-------+-----------+
|     id|parsed_date|
+-------+-----------+
|1471783| 2017-12-18|
|1471885| 2017-12-18|
|1472928| 2017-12-19|
|1476917| 2017-12-19|
|1477469| 2017-12-21|
|1478190| 2017-12-21|
|1478570| 2017-12-19|
|1481415| 2017-12-21|
|1472592| 2017-12-20|
|1474023| 2017-12-22|
|1474029| 2017-12-22|
|1474067| 2017-12-24|
+-------+-----------+
我有一个如下所示的函数。目的是传递日期(天)和t(天数)。在df1中,id在范围内计数(天-t,天),在df2中,id在范围内计数(天,天+t)

我想知道如果在该范围内缺少日期,如何修复此代码?假设2017年12月22日<代码>没有记录?是否有可能在记录中有即时天数?我的意思是如果
2017-12-22
不存在,而
2017-12-21
之后的下一个日期是
2017-12-24
,那么是否可以采取某种方式


感谢您帮助创建函数
hypo_1(df,day,t)

我删除了
2017-12-22
行以进行说明。其思想是获得一个按日期排序的
densite\u秩
(降序为before,升序为after),并过滤具有秩的行,代码工作绝对正常。谢谢你的语气。因为我拥有的数据集有数十亿行,所以这需要很多时间。有没有一种方法可以优化速度?我认为一种可能的方法是在你之前的问题中使用过滤器,但将其设置为10天左右,这样你就不需要计算每一行的密度等级。我想问一个后续问题。很抱歉这样的延迟,因为之前我使用的是针对小数据集的解决方案,现在我想使用重数据集。当我尝试df.show()时,我的代码被卡住了,我看到
org.apache.spark.sql.execution.window.WindowExec:没有为窗口操作定义分区!将所有数据移动到单个分区,可能会导致性能严重下降。
。有什么建议吗?你有没有像我在上面的评论中所说的那样尝试添加一个过滤器?我不知道应该将过滤器放在哪里?你能帮忙吗?
def hypo_1(df, day, t):
    df1 = (df.filter(f"parsed_date between '{day}' - interval {t} days and '{day}' - interval 1 day")
             .withColumn('count_before', F.count('id').over(Window.partitionBy('parsed_date')))
             .orderBy('parsed_date')
          )
    df2 = (df.filter(f"parsed_date between '{day}' + interval 1 day and '{day}' + interval {t} days")
             .withColumn('count_after', F.count('id').over(Window.partitionBy('parsed_date')))
             .orderBy('parsed_date')
          )
    return [df1, df2]

df1, df2 = hypo_1(df, '2017-12-20', 2)
df1.show()
+-------+-----------+------------+
|     id|parsed_date|count_before|
+-------+-----------+------------+
|1471783| 2017-12-18|           2|
|1471885| 2017-12-18|           2|
|1472928| 2017-12-19|           3|
|1476917| 2017-12-19|           3|
|1478570| 2017-12-19|           3|
+-------+-----------+------------+

df2.show()
+-------+-----------+-----------+
|     id|parsed_date|count_after|
+-------+-----------+-----------+
|1481415| 2017-12-21|          3|
|1478190| 2017-12-21|          3|
|1477469| 2017-12-21|          3|
|1474023| 2017-12-22|          2|
|1474029| 2017-12-22|          2|
+-------+-----------+-----------+
from pyspark.sql import functions as F, Window

def hypo_1(df, day, t):
    df1 = (df.filter(f"parsed_date < '{day}'")
             .withColumn('rn', F.dense_rank().over(Window.orderBy(F.desc('parsed_date'))))
             .filter('rn <= 2')
             .drop('rn')
             .withColumn('count_before', F.count('id').over(Window.partitionBy('parsed_date')))
             .orderBy('parsed_date')
          )
    df2 = (df.filter(f"parsed_date > '{day}'")
             .withColumn('rn', F.dense_rank().over(Window.orderBy('parsed_date')))
             .filter('rn <= 2')
             .drop('rn')
             .withColumn('count_after', F.count('id').over(Window.partitionBy('parsed_date')))
             .orderBy('parsed_date')
          )
    return [df1, df2]

df1, df2 = hypo_1(df, '2017-12-20', 2)
df1.show()
+-------+-----------+------------+
|     id|parsed_date|count_before|
+-------+-----------+------------+
|1471783| 2017-12-18|           2|
|1471885| 2017-12-18|           2|
|1472928| 2017-12-19|           3|
|1476917| 2017-12-19|           3|
|1478570| 2017-12-19|           3|
+-------+-----------+------------+

df2.show()
+-------+-----------+-----------+
|     id|parsed_date|count_after|
+-------+-----------+-----------+
|1477469| 2017-12-21|          3|
|1481415| 2017-12-21|          3|
|1478190| 2017-12-21|          3|
|1474067| 2017-12-24|          1|
+-------+-----------+-----------+