SPARK单调增加ID在数据框架中无法正常工作



我在Spark中有一个dataframe df,看起来像这样:

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

我尝试将ID列与以下代码

一起包含
val df_id = df.withColumn("id",monotonicallyIncreasingId)

,但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|
+--------+--------+----------+

如您所见,它从0到5,但下一个ID是8589934592而不是6等。

那怎么了?为什么ID列在此处未正确索引?

它可以按预期工作。此函数并非旨在生成连续值。相反,它通过分区编码分区编号和索引

生成的ID保证在单调上增加且独特,但不是连续的。当前的实现将分区ID放置在上部31位,并在下部33位中的每个分区中的记录编号。假设数据框架的分区少于10亿,并且每个分区的记录少于80亿。

作为一个例子,请考虑一个带有两个分区的数据框,每个框架都有3个记录。此表达式将返回以下ID:

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

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

相关内容

  • 没有找到相关文章

最新更新