Pyspark - 计算两个数据帧之间的日期

维尼修斯·苏亚雷斯

我有两个数据框,每个数据框都有一个日期列。IE:


+-----------+
|  DEADLINES|
+-----------+
| 2023-07-15|
| 2018-08-10|
| 2022-03-28|
| 2021-06-22|
| 2021-12-18|
| 2021-10-11|
| 2021-11-13|
+-----------+

+----------+
|   DT_DATE|
+----------+
|2021-04-02|
|2021-04-21|
|2021-05-01|
|2021-06-03|
|2021-09-07|
|2021-10-12|
|2021-11-02|
+----------+

我需要计算DT_DATE给定参考日期和每个日期之间有多少个DEADLINES日期。

例如:使用2021-03-31作为参考日期应该给出以下结果集。

+-----------+------------+
|  DEADLINES|    dt_count|
+-----------+------------+
| 2023-07-15|           7|
| 2018-08-10|           0|
| 2022-03-28|           7|
| 2021-06-22|           4|
| 2021-12-18|           7|
| 2021-10-11|           5|
| 2021-11-13|           7|
+-----------+------------+

我设法让它在最后期限数据帧的每一行中进行迭代,但是对于更大的数据集,性能变得非常差。

有没有人有更好的解决方案?

编辑:那是我目前的解决方案:

def count_days(deadlines_df, dates_df, ref_date):
    for row in deadlines_df.collect():
        qtt = dates_df.filter(dates_df.DT_DATE.between(ref_date, row.DEADLINES)).count()
        yield row.DEADLINES, qtt


new_df = spark.createDataFrame(count_days(deadlines_df, dates_df, "2021-03-31"), ["DEADLINES", "dt_count"])
帕夏701

两个数据帧都可以用不同的权重组合,窗口函数的范围从开始到当前使用的行(Scala):

val deadlines = Seq(
  ("2023-07-15"),
  ("2018-08-10"),
  ("2022-03-28"),
  ("2021-06-22"),
  ("2021-12-18"),
  ("2021-10-11"),
  ("2021-11-13")
).toDF("DEADLINES")

val dates = Seq(
  ("2021-04-02"),
  ("2021-04-21"),
  ("2021-05-01"),
  ("2021-06-03"),
  ("2021-09-07"),
  ("2021-10-12"),
  ("2021-11-02")
).toDF("DT_DATE")

val referenceDate = "2021-03-31"
val united = deadlines.withColumn("weight", lit(0))
  .unionAll(
    dates
      .where($"DT_DATE" >= referenceDate)
      .withColumn("weight", lit(1))
  )

val fromStartToCurrentRowWindow = Window.orderBy("DEADLINES").rangeBetween(Window.unboundedPreceding, Window.currentRow)

val result = united
  .withColumn("dt_count", sum("weight").over(fromStartToCurrentRowWindow))
  .where($"weight" === lit(0))
  .drop("weight")

输出:

+----------+--------+
|DEADLINES |dt_count|
+----------+--------+
|2018-08-10|0       |
|2021-06-22|4       |
|2021-10-11|5       |
|2021-11-13|7       |
|2021-12-18|7       |
|2022-03-28|7       |
|2023-07-15|7       |
+----------+--------+

注意:计算将在一个分区中执行,Spark 显示这样的警告:WARN Logging - No Partition Defined for Window operation!将所有数据移动到单个分区,这会导致严重的性能下降。

还有其他可能的解决方案,按范围连接两个数据帧,这导致笛卡尔连接。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从PySpark中的两个数据帧计算值

比较两个数据帧Pyspark

PySpark:合并两个数据帧

如何比较PySpark中两个数据帧的计数?

在PySpark中的两个数据框之间查找更改

在两个日期之间过滤 Pyspark 数据框

pyspark 内连接的替代方法来比较 pyspark 中的两个数据帧

Pyspark:如何在 Pyspark 中连接两个数据帧

在pyspark中将两个数据帧中的一个数据帧作为单独的子列

合并两个数据框pyspark

联接两个Pyspark数据帧的两种方法之间有什么区别

通过 Pyspark (Python) 上的内部连接和过滤条件连接两个数据帧

通过子字符串搜索连接pyspark中的两个数据帧

迭代两个数据帧,比较和更改 pandas 或 pyspark 中的值

比较两个数据帧并在pyspark中返回一行的结果

Pyspark 数据帧中两个字符串之间的相似性

PySpark :(广播)在最接近的日期时间/ unix上连接两个数据集

R计算两个数据帧之间的重复项

在pyspark数据框中的两个日期之间生成每月时间戳记

过滤两个不同日期范围之间的pyspark数据框行

比较两个带有pySpark的大型数据帧

优化两个大型pyspark数据帧的连接

Pyspark - 从两个不同的数据帧中减去列

PySpark将两个数据帧写入同一分区,但由文件夹分隔

Pyspark:内部连接两个 pyspark 数据帧并选择第一个数据帧中的所有列和第二个数据帧中的几列

Pyspark:两个日期之间的差异(Cast TimestampType,Datediff)

pyspark:两个日期列之间的小时差

查找Pyspark中两个日期之间的周末天数

在PySpark中合并两个数据框