如何在基于另一列的数据框中添加自动递增列?

How to add an auto-incrementing column in a dataframe based on another column?

我有一个类似于下面的 PySpark 数据框:

order_id    item    qty
123          abc    1
123          abc1   4
234          abc2   5
234          abc3   2
234          abc4   7
123          abc5   5
456          abc6   9
456          abc7   8
456          abc8   9

我想在 'order_id' 列的基础上添加一个自增列,预期结果是:

order_id    item    qty AutoIncrementingColumn_orderID
123         abc      1   1
123         abc1     4   2
234         abc2     5   1
234         abc3     2   2
234         abc4     7   3
123         abc5     5   3
456         abc6     9   1
456         abc7     8   2
456         abc8     9   3

我找不到基于另一列生成的解决方案,知道如何实现吗?

您可以使用 row_number:

from pyspark.sql import functions as F, Window

df2 = df.withColumn(
    'AutoIncrementingColumn_orderID', 
    F.row_number().over(Window.partitionBy('order_id').orderBy('item'))
)

df2.show()
+--------+----+---+------------------------------+
|order_id|item|qty|AutoIncrementingColumn_orderID|
+--------+----+---+------------------------------+
|     234|abc2|  5|                             1|
|     234|abc3|  2|                             2|
|     234|abc4|  7|                             3|
|     456|abc6|  9|                             1|
|     456|abc7|  8|                             2|
|     456|abc8|  9|                             3|
|     123| abc|  1|                             1|
|     123|abc1|  4|                             2|
|     123|abc5|  5|                             3|
+--------+----+---+------------------------------+

几种实现方式:

这是sql方式:

df=Ss.sql("""
select order_id,item,qty,row_number() over(partition by order_id order by qty) as autoInc
from (
select order_id,item,qty
from ( values 
(123,'abc',1 ),
(123,'abc1',4),
(234,'abc2',5),
(234,'abc3',2),
(234,'abc4',7),
(123,'abc5',5),
(456,'abc6',9),
(456,'abc7',8),
(456,'abc8',9)
) as T(order_id,item,qty))""")

df.show()

输出:

+--------+----+---+-------+
|order_id|item|qty|autoInc|
+--------+----+---+-------+
|     456|abc7|  8|      1|
|     456|abc6|  9|      2|
|     456|abc8|  9|      3|
|     234|abc3|  2|      1|
|     234|abc2|  5|      2|
|     234|abc4|  7|      3|
|     123| abc|  1|      1|
|     123|abc1|  4|      2|
|     123|abc5|  5|      3|
+--------+----+---+-------+