我需要向数据帧添加一个索引列,并具有三个非常简单的约束:
我确信我错过了一些明显的东西,因为我发现的例子对于这样一个简单的任务来说看起来非常复杂,或者使用非顺序、非确定性越来越单调的 id。我不想使用索引进行压缩,然后必须将以前分隔的列分开,这些列现在位于单个列中,因为我的数据帧以 TB 为单位,这似乎没有必要。我不需要按任何内容进行分区,也不需要按任何内容进行排序,我找到的示例就是这样做的(使用窗口函数和 row_number)。我需要的只是一个简单的 0 到 df.count 整数序列。我在这里缺少什么?
1, 2, 3, 4, 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
)
Also, row_number()
从 1 开始,所以你必须减去 1 才能从 0 开始。最后一个值是df.count - 1
.
我不想使用索引进行压缩,然后必须将以前分隔的列分开,这些列现在位于单个列中
You can use zipWithIndex
如果你按照它打电话map
,以避免所有分离的列变成单个列:
cols = df.columns
df = df.rdd.zipWithIndex().map(lambda row: (row[1],) + tuple(row[0])).toDF(["index"] + cols
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)