问题描述
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,qty
from ( values
(123,'abc',1 ),(123,'abc1',4),(234,'abc2',5),'abc3',2),'abc4',7),'abc5',(456,'abc6',9),'abc7',8),'abc8',9)
) as T(order_id,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|
+--------+----+---+-------+