每完成 4 位数字重置 pyspark 行号
pyspark row number reset for every 4 digits completion
我在基于一个列分区的特定列上应用 row_number。一旦通过pyspark达到999,如何将行号重置为起始号1?
partcode
row number
12345
0001
12345
0002
12345
0003
12345
9999 -- Reaches max
12345
0001
12345
0002
生成后row number
:
- 从
row number
中减去 1
得到从零开始的行号
- 使用
cut-off value (9999)
应用模运算
- 将
1
添加到模数结果以获得 row number
从 1 开始并返回到行号 cut-off value + 1
的 1
In my example I have used a smaller cutoff value of 3
from pyspark.sql import Window
from pyspark.sql import functions as F
df = spark.createDataFrame([(12345, )for _ in range(0, 10)], ("partcode", ))
window_spec = Window.partitionBy("partcode").orderBy("partcode")
cut_off = 3
df.withColumn("row number", F.row_number().over(window_spec))\
.withColumn("row number", F.lpad(((F.col("row number") - F.lit(1)) % F.lit(cut_off)) + F.lit(1), 4, '0'))\
.show()
输出
+--------+----------+
|partcode|row number|
+--------+----------+
| 12345| 0001|
| 12345| 0002|
| 12345| 0003|
| 12345| 0001|
| 12345| 0002|
| 12345| 0003|
| 12345| 0001|
| 12345| 0002|
| 12345| 0003|
| 12345| 0001|
+--------+----------+
我在基于一个列分区的特定列上应用 row_number。一旦通过pyspark达到999,如何将行号重置为起始号1?
partcode | row number |
---|---|
12345 | 0001 |
12345 | 0002 |
12345 | 0003 |
12345 | 9999 -- Reaches max |
12345 | 0001 |
12345 | 0002 |
生成后row number
:
- 从
row number
中减去1
得到从零开始的行号 - 使用
cut-off value (9999)
应用模运算
- 将
1
添加到模数结果以获得row number
从 1 开始并返回到行号cut-off value + 1
的 1
In my example I have used a smaller cutoff value of
3
from pyspark.sql import Window
from pyspark.sql import functions as F
df = spark.createDataFrame([(12345, )for _ in range(0, 10)], ("partcode", ))
window_spec = Window.partitionBy("partcode").orderBy("partcode")
cut_off = 3
df.withColumn("row number", F.row_number().over(window_spec))\
.withColumn("row number", F.lpad(((F.col("row number") - F.lit(1)) % F.lit(cut_off)) + F.lit(1), 4, '0'))\
.show()
输出
+--------+----------+
|partcode|row number|
+--------+----------+
| 12345| 0001|
| 12345| 0002|
| 12345| 0003|
| 12345| 0001|
| 12345| 0002|
| 12345| 0003|
| 12345| 0001|
| 12345| 0002|
| 12345| 0003|
| 12345| 0001|
+--------+----------+