python - 如何将顺序递增的列添加到从 n 开始的 spark 数据帧(PySpark)?
问题描述
我有一个具有值的数据框,例如
-------------
| col1 | col2 |
-------------
| a | 2 |
| b | 3 |
| c | 4 |
| d | 5 |
-------------
我想创建第三列,该列具有从指定数字开始的自动递增值。
假设我希望数字从 5 开始,那么预期的输出应该是
--------------------
| col1 | col2 | col3 |
|--------------------|
| a | 2 | 5 |
| b | 3 | 6 |
| c | 4 | 7 |
| d | 5 | 8 |
--------------------
我已经尝试过monotonically_increasing_id()
,但是由于分区,它没有给出序列号,而且它也没有从指定数字开始的功能。
我正在使用 Spark 2.4.5 和 Pyspark (python)。
解决方案
row_number
我们可以使用带有orderby()
(用于全局排序)子句的窗口函数并添加4
以从5
在 Pyspark 中:
Using row_number():
from pyspark.sql.window import Window
from pyspark.sql.functions import *
df=spark.createDataFrame([('a',2),('b',3),('c',4),('d',5)],['col1','col2']).repartition(4)
w=Window.orderBy('col2')
df.withColumn("col3",row_number().over(w) + 4).show()
#+----+----+----+
#|col1|col2|col3|
#+----+----+----+
#| a| 2| 5|
#| b| 3| 6|
#| c| 4| 7|
#| d| 5| 8|
#+----+----+----+
在斯卡拉:
val w = Window.orderBy("col2")
df.withColumn("col3", row_number().over(w) + 4).show()
//+----+----+----+
//|col1|col2|col3|
//+----+----+----+
//| a| 2| 5|
//| b| 3| 6|
//| c| 4| 7|
//| d| 5| 8|
//+----+----+----+
推荐阅读
- javascript - 如何在 WebView Android 中包含 JavaScript
- redux - redux 中间件接下来需要“返回”还是隐含的?
- c++ - 没有 set::inset 的重载函数错误实例
- hive - 通过 hive-site.xml 属性访问 pyhive
- javascript - 将状态附加到 API 数据中的国家/地区
- spring - 如果直接命中端点而不是映射器,如何回滚?
- time-series - 绘图中的多个时间滑块
- sql - 更新 Postgres 13 中的部分 jsonb 字段
- proxy - 安装 Python 包时出现 ProxyError。(同时使用 Conda 和 Pip)
- docker - 监控 docker stack 中的挂载卷