pyspark - PySpark:根据当前行值计算行数
问题描述
我有一个带有“速度”列的 DataFrame。
我可以有效地为每一行添加一个列,其中包含 DataFrame 中的行数,使得它们的“速度”在“速度”行的 +/2 范围内?
results = spark.createDataFrame([[1],[2],[3],[4],[5],
[4],[5],[4],[5],[6],
[5],[6],[1],[3],[8],
[2],[5],[6],[10],[12]],
['Speed'])
results.show()
+-----+
|Speed|
+-----+
| 1|
| 2|
| 3|
| 4|
| 5|
| 4|
| 5|
| 4|
| 5|
| 6|
| 5|
| 6|
| 1|
| 3|
| 8|
| 2|
| 5|
| 6|
| 10|
| 12|
+-----+
解决方案
您可以使用窗口函数:
# Order the window by speed, and look at range [0;+2]
w = Window.orderBy('Speed').rangeBetween(0,2)
# Define a column counting the number of rows containing value Speed+2
results = results.withColumn('count+2',F.count('Speed').over(w)).orderBy('Speed')
results.show()
+-----+-----+
|Speed|count|
+-----+-----+
| 1| 6|
| 1| 6|
| 2| 7|
| 2| 7|
| 3| 10|
| 3| 10|
| 4| 11|
| 4| 11|
| 4| 11|
| 5| 8|
| 5| 8|
| 5| 8|
| 5| 8|
| 5| 8|
| 6| 4|
| 6| 4|
| 6| 4|
| 8| 2|
| 10| 2|
| 12| 1|
+-----+-----+
注意:窗口函数对研究的行本身进行计数。您可以通过在计数列中添加 -1 来纠正此问题
results = results.withColumn('count+2',F.count('Speed').over(w)-1).orderBy('Speed')
推荐阅读
- jersey - 嵌入式码头不加载 servlet 或 jersey servlet 容器。我可以加载其中任何一个但不能同时加载
- r - Sparklyr 与 LIVY 一起使用的端口
- r - 根据 df1 的向量值和 R 中 xts2 列的时间序列创建时间序列
- java - 如何将 javaFX 与 javaFXML 一起使用
- java - 在 Java 中加载 Rust 代码,java.lang.UnsatisfiedLinkError:
- android - 删除签名验证会自动授予运行时权限吗?
- python - 在 SQLAlchemy 中引用表名和列名
- google-analytics - utm_source 和 utm_medium 在 SPA 中丢失
- css - 如何在 R Shiny 应用程序中左对齐乳胶方程?
- css - 进度条从父容器外部开始