Pyspark向数据帧添加顺序和确定性索引

xv7*_*v70 3 indexing pyspark

我需要使用三个非常简单的约束将索引列添加到数据框:

  • 从0开始

  • 是顺序的

  • 确定性的

我确定我遗漏了一些明显的东西,因为对于这样一个简单的任务,或者使用非顺序,不确定性越来越单调的id,我发现的示例看起来非常复杂。我不想使用index压缩,然后不得不将以前分开的列现在分开放在单列中,因为我的数据帧在TB中,这似乎是不必要的。我不需要按任何分区,也不需要按任何顺序进行分区,而我所找到的示例可以做到这一点(使用窗口函数和row_number)。我需要的只是一个简单的0到df.count整数序列。我在这里想念什么?

12345

pau*_*ult 5

我的意思是:如何添加有序,单调递增1序列0:df.count的列?(来自评论)

您可以row_number()在此处使用,但为此您需要指定一个orderBy()。由于您没有订购列,因此请使用monotonically_increasing_id()

from pyspark.sql.functions import row_number, monotonically_increasing_id
from pyspark.sql import Window

df = df.withColumn(
    "index",
    row_number().over(Window.orderBy(monotonically_increasing_id()))-1
)
Run Code Online (Sandbox Code Playgroud)

另外,row_number()从1开始,因此您必须减去1才能使其从0开始。最后一个值为df.count - 1


我不想用索引压缩,然后不得不将以前分开的列分开,这些列现在位于单个列中

可以使用zipWithIndex,如果你按照它与调用map,以避免所有分离出列变成一列:

cols = df.columns
df = df.rdd.zipWithIndex().map(lambda row: (row[1],) + tuple(row[0])).toDF(["index"] + cols
Run Code Online (Sandbox Code Playgroud)