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
时,你的答案有效,但当我除以say10
时,结果与预期不符output@nmr我做了一个修正,再次检查你的答案现在有效了。但用户12345答案很简单当我除以2
时,你的答案有效,但当我除以say10
时,结果与预期不符output@nmr我做了一个修正,再次检查你的答案现在有效了。但user12345的答案很简单