Spark镶嵌分配指数

时间:2018-05-28 02:36:43

标签: python apache-spark pyspark apache-spark-sql

我想知道生成列index的最有效方法 在每个标签组中唯一标识的记录:

+-------+-------+-------+
| label | value | index |
+-------+-------+-------+
| a     | v1    | 0     |
+-------+-------+-------+
| a     | v2    | 1     |
+-------+-------+-------+
| a     | v3    | 2     |
+-------+-------+-------+
| a     | v4    | 3     |
+-------+-------+-------+
| b     | v5    | 0     |
+-------+-------+-------+
| b     | v6    | 1     |
+-------+-------+-------+

我的实际数据非常大,每组标签都有相同的记录数。列索引将用于Pivot。 我可以做通常的排序+ for循环增量+检查如果cur<> pre然后重置索引等,但总是欢迎更快更有效的方式。

编辑:从建议的问题中得到答案:

from pyspark.sql import Row, functions as F
from pyspark.sql.window import Window

df = df.withColumn("index", 
                   F.row_number().over(
                       Window.partitionBy("label").orderBy("value"))
                  )

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用Window函数在label列上进行分区时创建基于排名的列。但是,这需要订购 - 在本例中为value

from pyspark.sql.window import Window
from pyspark.sql.functions import row_number

window = Window.partitionBy(df['label']).orderBy(df['value'])
df.withColumn('index', row_number().over(window))

这将为新列index提供从1开始的值(从0开始,只需将-1添加到上面的表达式中)。这些值将按value列的顺序给出。