python - 如何在 Pyspark 中获取最近的 N 个日期

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

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

| 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 |

编辑:我在编辑后回顾了我的问题,并意识到一开始不进行编辑是正确的选择

最佳答案

使用 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条记录)。

关于python - 如何在 Pyspark 中获取最近的 N 个日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64143337/

相关文章:

python - 我添加到图表中的补丁在 alpha=1 时不是不透明的。为什么?

python - 如何在 PySpark 中将列从字符串转换为数组

streaming - 如何使 Spark 分区具有粘性,即与节点保持一致?

scala - Spark 1.3.0 的 API 中 SchemaRDD 的声明在哪里

java - 具有 DataFrame API 的 Apache Spark MLlib 在 createDataFrame() 或 read().csv(...) 时给出 java.net.URISyntaxException

pyspark - databricks 自动加载器使用 MAP() 类型作为模式提示

csv - 将 array<string> 转换为字符串 pyspark 数据帧

python - pyenv 在激活虚拟环境时不再正确设置路径

python - 不同的颜色代表不同的值范围

python - Tornado 与 ThreadPoolExecutor