Pyspark如何在不改变顺序的情况下在dataframe中添加行号?

plicqrtu  于 2023-04-19  发布在  Spark
关注(0)|答案(2)|浏览(131)

我想为下面的dataframe添加一列行号,但保持原来的顺序。
现有的dataframe:

+-—-+
|val|
+-—-+
|1.0|
+-—-+
|0.0|
+-—-+
|0.0|
+-—-+
|1.0|
+-—-+
|0.0|
+-—-+

我的预期输出:

+-—-+-—-+
|idx|val|
+-—-+-—-+
|  1|1.0|
+-—-+-—-+
|  2|0.0|
+-—-+-—-+
|  3|0.0|
+-—-+-—-+
|  4|1.0|
+-—-+-—-+
|  5|0.0|
+-—-+-—-+

我尝试了很多代码,如下所示:

from pyspark.sql.functions import row_number,lit
from pyspark.sql.window import Window
w = Window().orderBy(lit('A'))
df = df.withColumn("row_num", row_number().over(w))
Window.partitionBy("xxx").orderBy("yyy")

但是上面的代码只是groupby的值和设置索引,这会使我的df不按顺序排列。
我们可以只增加一列而不改变顺序吗?

hl0ma9xz

hl0ma9xz1#

在Apache Spark中没有顺序这样的东西,它是一个分布式系统,数据被划分为称为分区的更小的块,每个操作都将应用于这些分区,分区的创建是随机的,所以除非在orderBy()子句中指定,否则您将无法保持顺序,因此如果您需要保持顺序,则需要指定将使用哪个列来保持顺序。

wztqucjr

wztqucjr2#

哦,只是尝试了另一种方法,它的工作,请告诉我,当我错了在一些其他情况下。
df_test01是上述 Dataframe

rdd = df_test01.rdd.zipWithIndex().map(lambda x: (x[1],) + x[0])
df_test02 = rdd.toDF(["row_number", "value"])
display(df_test02)

相关问题