我想在 pyspark 的数据框中创建一个带有连续数字的列,从指定的数字开始。例如,我想要向我的数据框 df 添加列 A,该列将从 5 开始,增量为一,直到达到数据框的长度,即 length(df),所以它将包含 5、6、7 等连续数字。
有没有使用 pyspark 方法的简单解决方案?
有没有使用 pyspark 方法的简单解决方案?
三个简单的步骤:
从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())))
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行
虽然这个问题很久以前就被问过了,但我认为我可以分享一下我找到的非常方便的解决方案。 基本上,要添加一个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))
这对我有用。这将在列中创建连续值。
seed = 23
df.withColumn('label', seed+dense_rank().over(Window.orderBy('column')))
df = df.rdd.zipWithIndex().toDF(cols + ["index"]).withColumn("index", f.col("index") + 5)
,其中cols = df.columns
,而f
指的是pyspark.sql.functions
。但你应该问问自己为什么要这样做,因为几乎肯定有更好的方法。数据框架本质上是无序的,所以这个操作并不高效。 - paultmax(id) + spark_func.row_number().over(Window.orderBy(unique_field_in_my_df)
- max04