为什么在352之后添加一个单调增加id中断的新id列

时间:2017-12-04 07:15:25

标签: python pyspark spark-dataframe

我正在使用pyspark 2.2.0。添加递增值的新列。我使用了以下代码:

new_df = df.withColumn('Id', monotonically_increasing_id())

但它在第352行之后就像这样打破了:

screenshot of error

有任何解决此问题的方法吗?

3 个答案:

答案 0 :(得分:3)

根据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|
+---+-----+------------+

答案 1 :(得分:1)

根据docs,函数生成的值不必是连续的。

  

生成的ID保证单调增加且唯一,但不是连续的

答案 2 :(得分:0)

正如spark文档中所述,monotonically_increasing_id可能不是连续的。您可以将dataframe转换为rdd,然后使用rdd.zipWithIndex()代替添加增量值。