Apache spark 为pyspark数据帧中的记录间隔指定一个常量值

Apache spark 为pyspark数据帧中的记录间隔指定一个常量值,apache-spark,pyspark,Apache Spark,Pyspark,我在pyspark df = spark.createDataFrame( [(1,'Y'), (2,'Y'), (3,'N'), (4,'N'), (5,'N'), (6,'Y'), (7,'N') ], ('id', 'status') ) df.show() +---+------+ | id|status| +---+------+ | 1| Y| | 2| Y| | 3| N| | 4| N| | 5| N| | 6|

我在
pyspark

df = spark.createDataFrame(
[(1,'Y'),
(2,'Y'),
(3,'N'),
(4,'N'),
(5,'N'),
(6,'Y'),
(7,'N')
],
('id', 'status')
)


df.show()

+---+------+
| id|status|
+---+------+
|  1|     Y|
|  2|     Y|
|  3|     N|
|  4|     N|
|  5|     N|
|  6|     Y|
|  7|     N|
+---+------+
现在,我想通过为记录组分配相同的值,在数据框中创建一个新列
pack
。例如,两条记录是一个组

值应从
0开始

预期结果:

+---+------+----+
| id|status|pack|
+---+------+----+
|  1|     Y|   0|
|  2|     Y|   0|
|  3|     N|   1|
|  4|     N|   1|
|  5|     N|   2|
|  6|     Y|   2|
|  7|     N|   3|
+---+------+----+
我应用了
row\u number
函数,如下所示

import pyspark.sql.functions as f
from pyspark.sql import Window

df1 = df.withColumn( "pack", f.round(f.row_number().over(Window.orderBy(f.lit(None)))/2).cast('int') )

df1.show()
+---+------+----+
| id|status|pack|
+---+------+----+
|  1|     Y|   1|
|  2|     Y|   1|
|  3|     N|   2|
|  4|     N|   2|
|  5|     N|   3|
|  6|     Y|   3|
|  7|     N|   4|
+---+------+----+

即使答案与我想要的相似,但值从
1
开始,而不是从
0
开始,我会更改创建行号的方式。为了保证数据的排序方式与输入的排序方式相同,请改为
f.row\u number().over(Window.orderBy(f.monotionally\u increating\u id())

导入pyspark.sql.f函数
从pyspark.shell导入spark
从pyspark.sql导入窗口
df=spark.createDataFrame(
[(1,'Y'),
(2,'Y'),
(3,'N'),
(4,'N'),
(5,'N'),
(6,'Y'),
(7,'N'),
(10,'Y'),
(11,‘N’)
],('id','status'))
df=(df
.withColumn('row\u number',f.row\u number().over(Window.orderBy(f.单调递增的\u id()))
.withColumn('increase',((f.col('row_number'))>f.lit(2))&
(f.col('row_number')%f.lit(2)=f.lit(1)).cast('Int'))
.withColumn('pack',f.sum('increase')。超过(Window.orderBy('row_number'))
.drop('行编号','增加')
df.show(truncate=False)
输出

+---+------+----+
|id |status|pack|
+---+------+----+
|1  |Y     |0   |
|2  |Y     |0   |
|3  |N     |1   |
|4  |N     |1   |
|5  |N     |2   |
|6  |Y     |2   |
|7  |N     |3   |
|10 |Y     |3   |
|11 |N     |4   |
+---+------+----+
+---+------+----+
| id|status|pack|
+---+------+----+
|  1|     Y|   0|
|  2|     Y|   0|
|  3|     N|   1|
|  4|     N|   1|
|  5|     N|   2|
|  6|     Y|   2|
|  7|     N|   3|
+---+------+----+

我将更改您创建行号的方式。为了保证数据的排序方式与输入的排序方式相同,请改为
f.row\u number().over(Window.orderBy(f.monotionally\u increating\u id())

导入pyspark.sql.f函数
从pyspark.shell导入spark
从pyspark.sql导入窗口
df=spark.createDataFrame(
[(1,'Y'),
(2,'Y'),
(3,'N'),
(4,'N'),
(5,'N'),
(6,'Y'),
(7,'N'),
(10,'Y'),
(11,‘N’)
],('id','status'))
df=(df
.withColumn('row\u number',f.row\u number().over(Window.orderBy(f.单调递增的\u id()))
.withColumn('increase',((f.col('row_number'))>f.lit(2))&
(f.col('row_number')%f.lit(2)=f.lit(1)).cast('Int'))
.withColumn('pack',f.sum('increase')。超过(Window.orderBy('row_number'))
.drop('行编号','增加')
df.show(truncate=False)
输出

+---+------+----+
|id |status|pack|
+---+------+----+
|1  |Y     |0   |
|2  |Y     |0   |
|3  |N     |1   |
|4  |N     |1   |
|5  |N     |2   |
|6  |Y     |2   |
|7  |N     |3   |
|10 |Y     |3   |
|11 |N     |4   |
+---+------+----+
+---+------+----+
| id|status|pack|
+---+------+----+
|  1|     Y|   0|
|  2|     Y|   0|
|  3|     N|   1|
|  4|     N|   1|
|  5|     N|   2|
|  6|     Y|   2|
|  7|     N|   3|
+---+------+----+
输出

+---+------+----+
|id |status|pack|
+---+------+----+
|1  |Y     |0   |
|2  |Y     |0   |
|3  |N     |1   |
|4  |N     |1   |
|5  |N     |2   |
|6  |Y     |2   |
|7  |N     |3   |
|10 |Y     |3   |
|11 |N     |4   |
+---+------+----+
+---+------+----+
| id|status|pack|
+---+------+----+
|  1|     Y|   0|
|  2|     Y|   0|
|  3|     N|   1|
|  4|     N|   1|
|  5|     N|   2|
|  6|     Y|   2|
|  7|     N|   3|
+---+------+----+
输出

+---+------+----+
|id |status|pack|
+---+------+----+
|1  |Y     |0   |
|2  |Y     |0   |
|3  |N     |1   |
|4  |N     |1   |
|5  |N     |2   |
|6  |Y     |2   |
|7  |N     |3   |
|10 |Y     |3   |
|11 |N     |4   |
+---+------+----+
+---+------+----+
| id|status|pack|
+---+------+----+
|  1|     Y|   0|
|  2|     Y|   0|
|  3|     N|   1|
|  4|     N|   1|
|  5|     N|   2|
|  6|     Y|   2|
|  7|     N|   3|
+---+------+----+

代码s中的数据帧与显示的一次检查索引2不同,它有N,但在显示中它有Y,为什么?@Yefet更正了它现在simple-1解决了您的问题吗?检查我的回答代码s中的数据帧与显示的数据帧不同检查索引2有N但在显示中有Y,为什么?@Yefet更正了它现在simple-1解决了您的问题吗?检查我的答案当我除以
2
时,你的答案有效,但当我除以say
10
时,结果与预期不符output@nmr我做了一个修正,再次检查你的答案现在有效了。但用户12345答案很简单当我除以
2
时,你的答案有效,但当我除以say
10
时,结果与预期不符output@nmr我做了一个修正,再次检查你的答案现在有效了。但user12345的答案很简单