Pyspark 对日期在每个ID的日期范围内的行进行计数

Pyspark 对日期在每个ID的日期范围内的行进行计数,pyspark,pyspark-sql,Pyspark,Pyspark Sql,我们有一个数据帧(数百万行),包括: 身份证 开始日期 结束日期 日期 对于每一行,我们使用日期变量,并希望计算每个id存在多少行,其中该日期位于开始日期和结束日期之间。 然后,该值应包含在新列(“行的总和”)中 下面是我们期望的表(创建变量时包含行的总和): 示例: 我们看第一排。以日期“2009-01-01”为例,查看 在所有行中,ID是该行的ID(此处为A)并计数 日期“2009-01-01”在开始和结束范围内的行数(本例中的第1行和第2行为True) 原始表的代码: table=sp

我们有一个数据帧(数百万行),包括:

  • 身份证
  • 开始日期
  • 结束日期
  • 日期
对于每一行,我们使用日期变量,并希望计算每个id存在多少行,其中该日期位于开始日期和结束日期之间。 然后,该值应包含在新列(“行的总和”)中

下面是我们期望的表(创建变量时包含行的总和):

示例: 我们看第一排。以日期“2009-01-01”为例,查看 在所有行中,ID是该行的ID(此处为A)并计数 日期“2009-01-01”在开始和结束范围内的行数(本例中的第1行和第2行为True)

原始表的代码:

table=spark.createDataFrame(
[
[“A”、“2008-01-02”、“2010-01-01”、“2009-01-01”],
[“A”,“2005-01-02”,“2012-01-01”,无],
[“A”、“2013-01-02”、“2015-01-01”、“2014-01-01”],
[“B”、“2002-01-02”、“2019-01-01”、“2003-01-01”],
[“B”、“2015-01-02”、“2017-01-01”、“2016-01-01”]
],
(“Id”、“开始”、“结束”、“日期”)
)

此代码起作用,但创建了一个“产品”连接,不建议使用大量数据

table2=table.select(
F.col(“id”),
F.col(“开始”)。别名(“s”),
F.col(“结束”)。别名(“e”),
)                                                       
table3=table.join(
表2,on=“id”
)
表3=表3.1,带列(
“一个”,
F.什么时候(
F.col(“日期”)。在(F.col(“s”)、F.col(“e”))之间,
1.
)。否则(0)
)
表3.1分组(
“身份证”,
“开始”,
“结束”,
“日期”
).agg(F.sum(“一”).别名(“行之和”).show()
+---+----------+----------+----------+-----------+                              
|Id |开始|结束|日期|行总数||
+---+----------+----------+----------+-----------+
|B | 2002-01-02 | 2019-01-01 | 2003-01-01 | 1|
|B | 2015-01-02 | 2017-01-01 | 2016-01-01 | 2|
|A | 2008-01-02 | 2010-01-01 | 2009-01-01 | 2|
|A | 2013-01-02 | 2015-01-01 | 2014-01-01 | 1|
|A | 2005-01-02 | 2012-01-01 |空| 0|
+---+----------+----------+----------+-----------+
+---+----------+----------+----------+-----------+
| Id|     start|       end|      date|sum_of_rows|
+---+----------+----------+----------+-----------+
|  A|2008-01-02|2010-01-01|2009-01-01|          2|
|  A|2005-01-02|2012-01-01|      null|       null|
|  A|2013-01-02|2015-01-01|2014-01-01|          1|
|  B|2002-01-02|2019-01-01|2003-01-01|          1|
|  B|2015-01-02|2017-01-01|2016-01-01|          2|
+---+----------+----------+----------+-----------+