Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 火花拼花地板组内分配索引_Python_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Python 火花拼花地板组内分配索引

Python 火花拼花地板组内分配索引,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,我想知道生成列索引的最有效方法 要在每组标签中唯一标识记录: +-------+-------+-------+ | label | value | index | +-------+-------+-------+ | a | v1 | 0 | +-------+-------+-------+ | a | v2 | 1 | +-------+-------+-------+ | a | v3 | 2 | +-------+--

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

+-------+-------+-------+
| label | value | index |
+-------+-------+-------+
| a     | v1    | 0     |
+-------+-------+-------+
| a     | v2    | 1     |
+-------+-------+-------+
| a     | v3    | 2     |
+-------+-------+-------+
| a     | v4    | 3     |
+-------+-------+-------+
| b     | v5    | 0     |
+-------+-------+-------+
| b     | v6    | 1     |
+-------+-------+-------+
我的实际数据非常大,每组标签都有相同数量的记录。列索引将用于透视。 我可以做通常的排序+for循环增量+检查curpre,然后重置索引,等等,但是一种更快更有效的方法总是受欢迎的

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

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

谢谢你的帮助

在对
标签
列进行分区时,可以使用
窗口
函数创建基于排名的列。但是,这需要排序-在本例中,在
值上

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

这将给出一个新列
索引
,其值从1开始(要从0开始,只需将
-1
添加到上述表达式中)。值将按
列的顺序给出。

rank()将在
s相同时出现问题,最好使用
行数()
@jxc,这是一个很好的观点。我更新了答案。