【问题标题】:How to get the N most recent dates in Pyspark如何在 Pyspark 中获取 N 个最近的日期
【发布时间】:2020-10-02 02:39:23
【问题描述】:

有没有办法为 Pyspark 中的每组数据获取最近 30 天的记录?在此示例中,获取 (Grouping, Bucket) 分组中日期最近的 2 条记录。所以像这样的表

| Grouping | Bucket | Date      |
|----------|--------|-----------|
| 1        | 1      | 9-20-2020 |
| 1        | 1      | 9-16-2020 |
| 1        | 1      | 8-14-2020 |
| 1        | 2      | 9-20-2020 |
| 1        | 2      | 9-16-2020 |
| 1        | 2      | 8-14-2020 |
| 2        | 1      | 9-20-2020 |
| 2        | 1      | 9-16-2020 |
| 2        | 1      | 8-14-2020 |

会变成这样:

| Grouping | Bucket | Date      |
|----------|--------|-----------|
| 1        | 1      | 9-20-2020 |
| 1        | 1      | 9-16-2020 |
| 1        | 2      | 9-20-2020 |
| 1        | 2      | 9-16-2020 |
| 2        | 1      | 9-20-2020 |
| 2        | 1      | 9-16-2020 |

编辑:我在编辑后查看了我的问题,并意识到不进行编辑是正确的选择

【问题讨论】:

  • 您是否尝试按今天 - 30 天过滤日期列?例如使用date_sub?
  • @OneCricketeer 我没有。这将如何在 filter() 中工作?
  • 类似df.filter(df("Date") >= date_sub(current_date(), 30)),不过,通常使用YYYY-mm-dd 格式更适合此类查询
  • 此过滤器如何帮助选择组中的前 2 名? @OneCricketeer
  • @A.B 我也想知道。问题已由 user7298979 更改

标签: python apache-spark pyspark apache-spark-sql


【解决方案1】:

使用window 并在每个窗口中取前两个ranks

df.withColumn("r", F.rank().over(Window.partitionBy("Grouping", "Bucket") \
                           .orderBy(F.col("Date").desc()))) \
    .filter("r <=2") \
    .drop("r") \
    .show()

输出:

+--------+------+----------+
|Grouping|Bucket|      Date|
+--------+------+----------+
|       1|     1|2020-09-20|
|       1|     1|2020-09-16|
|       1|     2|2020-09-20|
|       1|     2|2020-09-16|
|       2|     1|2020-09-20|
|       2|     1|2020-09-16|
+--------+------+----------+

编辑:此答案适用于this revision(获取每组最近的 N 条记录)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-22
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多