如何在pyspark数据框中创建顺序编号列?

4
我想在 pyspark 的数据框中创建一个带有连续数字的列,从指定的数字开始。例如,我想要向我的数据框 df 添加列 A,该列将从 5 开始,增量为一,直到达到数据框的长度,即 length(df),所以它将包含 567 等连续数字。
有没有使用 pyspark 方法的简单解决方案?

1
最简单的方法可能是 df = df.rdd.zipWithIndex().toDF(cols + ["index"]).withColumn("index", f.col("index") + 5),其中 cols = df.columns,而 f 指的是 pyspark.sql.functions。但你应该问问自己为什么要这样做,因为几乎肯定有更好的方法。数据框架本质上是无序的,所以这个操作并不高效。 - pault
谢谢!最后我想将最终结果添加到Hive表中。我必须从这个表中取出max(id),并添加id从max(id)+1开始的新记录。 - max04
我认为在Hive中无法像那样获取一个序列ID列。Hive/Spark旨在用于并行处理。即使我的评论中的代码适用于您,并且您可能能够想出一种方法来实现所需的结果,但这不是Spark或Hive的真正好用例。 - pault
我通过向我的数据框添加新列来处理它,就像这样:max(id) + spark_func.row_number().over(Window.orderBy(unique_field_in_my_df) - max04
4个回答

4

三个简单的步骤:

从pyspark.sql.window导入Window

从pyspark.sql.functions导入monotonically_increasing_id和row_number函数

df = df.withColumn("row_idx", row_number().over(Window.orderBy(monotonically_increasing_id())))


4
您可以使用 range 来完成此操作。
df_len = 100
freq =1
ref = spark.range(
    5, df_len, freq
).toDF("id")
ref.show(10)

+---+
| id|
+---+
|  5|
|  6|
|  7|
|  8|
|  9|
| 10|
| 11|
| 12|
| 13|
| 14|
+---+

仅显示前10行


2
问题是向现有数据框添加一个“新”列。 - Remis Haroon - رامز

2

虽然这个问题很久以前就被问过了,但我认为我可以分享一下我找到的非常方便的解决方案。 基本上,要添加一个1、2、3等列,您只需使用“lit”添加一个常量值为1的列。

from pyspark.sql import functions as func
from pyspark.sql.window import Window    
df= df.withColumn("Id", func.lit(1))

然后应用cumsum(在我的情况下,unique_field_in_my_df是一个日期列。可能您也可以使用索引)

windowCumSum = Window.partitionBy().orderBy('unique_field_in_my_df').rowsBetween(Window.unboundedPreceding,0)
df = df.withColumn("Id",func.sum("Id").over(windowCumSum))

0

这对我有用。这将在列中创建连续值。

seed = 23
df.withColumn('label', seed+dense_rank().over(Window.orderBy('column')))

需要数据在同一分区吗? - Blue Bird

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接