我有以下数据框:
timestamp sum
31/01/2017 09:00 0
31/01/2017 10:00 0
31/01/2017 11:00 0
31/01/2017 12:00 2
31/01/2017 13:00 2
31/01/2017 14:00 2
31/01/2017 15:00 11
并希望添加一个新的Id列 - 只是一个像这样的运行数字:
+----------------+---+---------+
| timestamp|sum|running_id|
+----------------+---+---------+
|2017-01-31 09:00| 0| 0|
|2017-01-31 10:00| 0| 1|
|2017-01-31 11:00| 0| 2|
|2017-01-31 12:00| 2| 3|
|2017-01-31 13:00| 2| 4|
|2017-01-31 14:00| 2| 5|
|2017-01-31 15:00| 11| 6|
我是这样做的:
sub_data_spark = sub_data_spark.rdd.zipWithIndex().map(lambda x: (x[0][0],x[0][1],x[1])).toDF(sub_data_spark.columns+["running_id"])
有人可以建议采用“更清洁”的方式吗?
谢谢, 鲍里斯
答案 0 :(得分:2)
没有zipWithIndex或zipWithUniqueId的唯一方法就是使用函数monotonically_increasing_id
此功能的工作方式如下:
生成单调递增的64位整数的列。
保证生成的ID单调增加 独特但不连续。目前的实施提出了 高31位中的分区ID,以及每个中的记录号 在较低的33位分区。假设是数据框架 具有少于10亿个分区,每个分区少于8个 十亿条记录。
因此,对于您的情况,您可以这样使用:
sub_data_spark.withColumn('Id', monotonically_increasing_id()).show()
这将返回您模型的唯一ID。但它不会从0开始,也不会顺序
答案 1 :(得分:2)
尝试使用select *, row_Number() over ( order by sum) from table
或任何基于逻辑的列。也可以使用PARTITION BY子句。