如何在Pyspark中实现以下R代码
l = data.frame(d=c(1,2,4,7,8,15,17,19,20,25,26,29))
l$d2[1]= 0
l$d3[1]=c=1
for(i in 2:nrow(l))
{ l$d2[i]=l$d[i]-l$d[i-1]
c= ifelse(l$d2[i]<=3,c,c+1)
l$d3[i]=c
}
l
我想遍历一个列并在值大于或等于 3 时递增一个计数器。
例如:假设我的专栏中的元素是
1,2,2,3,2,1,5,2,1
标志应该是: 1,1,1,2,2,2,3,3,3
谢谢
请您参考如下方法:
假设以下是输入数据。
输入:
df = spark.createDataFrame([[1,'A',1],[2,'A',2],[3,'A',2],[4,'A',3],[5,'A',2],\
[6,'A',5],[7,'B',1],[8,'B',2],[9,'B',5],[10,'B',1]],\
['sl_no','partition','value'])
df.show(10)
- sl_no - 序列号[基本上定义数据帧顺序的任何列]
- partition - 如果计数器需要根据现有列进行分区,则对列进行分区
- value - 计数器递增所依据的值
输出:
以下代码将为您提供所需的输出。
from pyspark.sql import Window
from pyspark.sql.functions import col, when, sum, lit
threshold= 3
df = df.withColumn("greater",when(col("value")>=lit(threshold),1).otherwise(0))\
.withColumn("counter",sum("greater").over(Window.partitionBy().orderBy("sl_no")))\
.withColumn("partitioned_counter",sum("greater").over(Window.partitionBy(["partition"]).orderBy("sl_no")))\
.orderBy("sl_no")
df.show(10)
- sl_no - 序列号[基本上定义数据帧顺序的任何列]
- partition - 如果计数器需要根据现有列进行分区,则对列进行分区
- value - 计数器递增所依据的值
- greater - 检查值是否大于阈值 [在本例中为 3]
- counter - 当值超过阈值时递增的计数器
- partitioned_counter - 由分区列分区的计数器
如果您只需要根据列的顺序和阈值创建一个总体计数器,您可以使用上面用于创建计数器列的代码。
如果用例是为分区列/分区列集单独实现计数器,那么您可以使用用于创建partitioned_counter 列的代码
