Spark-Monotonically增加id在数据帧中没有按预期工作?

ant*_*CR1 8 scala apache-spark apache-spark-sql

df在Spark中有一个数据框,看起来像这样:

scala> df.show()
+--------+--------+
|columna1|columna2|
+--------+--------+
|     0.1|     0.4|
|     0.2|     0.5|
|     0.1|     0.3|
|     0.3|     0.6|
|     0.2|     0.7|
|     0.2|     0.8|
|     0.1|     0.7|
|     0.5|     0.5|
|     0.6|    0.98|
|     1.2|     1.1|
|     1.2|     1.2|
|     0.4|     0.7|
+--------+--------+
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下代码包含id列

val df_id = df.withColumn("id",monotonicallyIncreasingId)
Run Code Online (Sandbox Code Playgroud)

但id列不是我所期望的:

scala> df_id.show()
+--------+--------+----------+
|columna1|columna2|        id|
+--------+--------+----------+
|     0.1|     0.4|         0|
|     0.2|     0.5|         1|
|     0.1|     0.3|         2|
|     0.3|     0.6|         3|
|     0.2|     0.7|         4|
|     0.2|     0.8|         5|
|     0.1|     0.7|8589934592|
|     0.5|     0.5|8589934593|
|     0.6|    0.98|8589934594|
|     1.2|     1.1|8589934595|
|     1.2|     1.2|8589934596|
|     0.4|     0.7|8589934597|
+--------+--------+----------+
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它从0到5顺利,但接下来的id 8589934592代替了6,依此类推.

那么这里有什么问题?为什么id列没有在这里正确编入索引?

hi-*_*zir 10

它按预期工作。此函数不适用于生成连续值。而是按分区编码分区号和索引

保证生成的ID单调递增且唯一,但不连续。当前实现将分区ID放在高31位中,将记录号放在每个低33位中。假定数据帧的分区少于10亿,每个分区的记录少于80亿。

例如,考虑一个具有两个分区的DataFrame,每个分区有3个记录。该表达式将返回以下ID:

0, 1, 2, 8589934592 (1L << 33), 8589934593, 8589934594.

如果需要连续的数字,请使用RDD.zipWithIndex

  • 您可以通过在DF上使用.repartition(1)使其连续,但是我宁愿使用此处提到的其他方法。 (2认同)