如何将正在运行的Id新列添加到Spark Data框架(pyspark)

时间:2017-02-13 15:09:11

标签: apache-spark dataframe pyspark

我有以下数据框:

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"])

有人可以建议采用“更清洁”的方式吗?

谢谢, 鲍里斯

2 个答案:

答案 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子句。