每完成 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:

  1. row number 中减去 1 得到从零开始的行号
  2. 使用 cut-off value (9999)
  3. 应用模运算
  4. 1 添加到模数结果以获得 row number 从 1 开始并返回到行号 cut-off value + 1
  5. 的 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|
+--------+----------+