为什么在 352 之后添加一个单调递增的 id 中断的新 id 列
why adding a new id column with monotonically increasing id break after 352
我正在使用 pyspark 2.2.0。添加一个新的增量值列。我使用了以下代码:
new_df = df.withColumn('Id', monotonically_increasing_id())
但它在第 352 行之后中断,如下所示:
有解决这个问题的方法吗?
根据 docs 函数生成的值不必是连续的。
The generated ID is guaranteed to be monotonically increasing and unique, but not consecutive
根据 mic4ael 的回答,生成的 ID 只能保证是单调递增和唯一的,但不是连续的。您可以使用 row_number
生成连续且单调递增的 id,但是,这种方法不能很好地扩展,对于较大的数据集应避免使用。例如,以此为输入数据:
from pyspark.sql.window import Window
from pyspark.sql.functions import col,row_number
df = spark.createDataFrame([('33004', ''),('33004', ''),('33010', 'Muxia'), ('33020','Fuensanta'),('33020','Fuensanta')], ("Zip", "PostalRegion"))
您可以使用以下方法添加顺序 ID
列:
from pyspark.sql.window import Window
w = Window().orderBy("PostalRegion")
df = df.select(row_number().over(w).alias("ID"), col("*"))
df.show()
输出为:
+---+-----+------------+
| ID| Zip|PostalRegion|
+---+-----+------------+
| 1|33004| |
| 2|33004| |
| 3|33020| Fuensanta|
| 4|33020| Fuensanta|
| 5|33010| Muxia|
+---+-----+------------+
如 spark 文档中所述,monotonically_increasing_id
可能不连续。您可以将 dataframe
转换为 rdd
并使用 rdd.zipWithIndex()
来增加增量值。
我正在使用 pyspark 2.2.0。添加一个新的增量值列。我使用了以下代码:
new_df = df.withColumn('Id', monotonically_increasing_id())
但它在第 352 行之后中断,如下所示:
有解决这个问题的方法吗?
根据 docs 函数生成的值不必是连续的。
The generated ID is guaranteed to be monotonically increasing and unique, but not consecutive
根据 mic4ael 的回答,生成的 ID 只能保证是单调递增和唯一的,但不是连续的。您可以使用 row_number
生成连续且单调递增的 id,但是,这种方法不能很好地扩展,对于较大的数据集应避免使用。例如,以此为输入数据:
from pyspark.sql.window import Window
from pyspark.sql.functions import col,row_number
df = spark.createDataFrame([('33004', ''),('33004', ''),('33010', 'Muxia'), ('33020','Fuensanta'),('33020','Fuensanta')], ("Zip", "PostalRegion"))
您可以使用以下方法添加顺序 ID
列:
from pyspark.sql.window import Window
w = Window().orderBy("PostalRegion")
df = df.select(row_number().over(w).alias("ID"), col("*"))
df.show()
输出为:
+---+-----+------------+
| ID| Zip|PostalRegion|
+---+-----+------------+
| 1|33004| |
| 2|33004| |
| 3|33020| Fuensanta|
| 4|33020| Fuensanta|
| 5|33010| Muxia|
+---+-----+------------+
如 spark 文档中所述,monotonically_increasing_id
可能不连续。您可以将 dataframe
转换为 rdd
并使用 rdd.zipWithIndex()
来增加增量值。