我在Spark中有一个数据框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列没有在这里正确编入索引?
答案 0 :(得分:7)
它按预期工作。此功能不适用于生成连续值。取而代之的是encodes partition number and index by partition
生成的ID保证单调增加且唯一,但不是连续的。当前实现将分区ID放在高31位中,将每个分区中的记录号放在低33位中。假设数据框的分区少于10亿,每个分区的记录少于80亿。
例如,考虑一个带有两个分区的DataFrame,每个分区有3条记录。该表达式将返回以下ID:
0, 1, 2, 8589934592 (1L << 33), 8589934593, 8589934594.
如果您想要连续的号码,请使用RDD.zipWithIndex
。