我有一个数据框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|
+--------+--------+
我尝试使用以下代码包含 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 列没有在此处正确索引?
它按预期工作。此函数不适用于生成连续值。相反它按分区编码分区号和索引 https://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.functions%24
生成的ID保证单调递增且唯一,但不连续。当前的实现将分区 ID 放在高 31 位中,将每个分区内的记录号放在低 33 位中。假设数据框的分区数少于10亿个,每个分区的记录数少于80亿条。
例如,考虑一个具有两个分区的 DataFrame,每个分区有 3 条记录。该表达式将返回以下 ID:
0, 1, 2, 8589934592 (1L << 33), 8589934593, 8589934594.
如果您想要连续的数字,请使用RDD.zipWithIndex
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)