Dataframe 在另一个窗口中创建窗口?
我有一个这样的数据帧Dataframe 在另一个窗口中创建窗口?,dataframe,apache-spark,Dataframe,Apache Spark,我有一个这样的数据帧 +----+-----+ |name|value| +----+-----+ | A| 7| | A| 5| | A| 1| | A| 1| | A| 1| | A| 6| | A| 1| | A| 1| | A| 1| | B| 2| | B| 1| +----+-----+ 我想将其转换为具有以下值的数据帧: +----+-----+ |name|value|
+----+-----+
|name|value|
+----+-----+
| A| 7|
| A| 5|
| A| 1|
| A| 1|
| A| 1|
| A| 6|
| A| 1|
| A| 1|
| A| 1|
| B| 2|
| B| 1|
+----+-----+
我想将其转换为具有以下值的数据帧:
+----+-----+
|name|value|
+----+-----+
| A| 7|
| A| 5|
| A| 5|
| A| 5|
| A| 5|
| A| 6|
| A| 6|
| A| 6|
| A| 6|
| B| 2|
| B| 2|
+----+-----+
实际上,我想在name
字段上通过分区创建一个窗口,然后在其中创建一个窗口(或类似的东西),从当前行的值开始,并对后续行的数据进行分组,直到出现一个值以外的值
如何做到这一点?基于@Manish在评论中的想法,我将1
值更改为null
,并添加了一个order
列,该列唯一地指示行的顺序
+----+-----+-----+
|name|order|value|
+----+-----+-----+
| A| 1| 7|
| A| 2| 5|
| A| 3| null|
| A| 4| null|
| A| 5| null|
| A| 6| 6|
| A| 7| null|
| A| 8| null|
| A| 9| null|
| B| 10| 2|
| B| 11| null|
+----+-----+-----+
然后使用带有ignorenulls
参数的last
方法解决了问题
win1 = Window.partitionBy("name").orderBy("order")
s = F.last(d.value, ignorenulls = True).over(win1)
d = d.withColumn(
'value1',
F.when(
d.name == F.lag('name').over(win1),
s
).otherwise(s)
)
d.show()
+----+-----+-----+
|name|order|value|
+----+-----+-----+
| B| 10| 2|
| B| 11| 2|
| A| 1| 7|
| A| 2| 5|
| A| 3| 5|
| A| 4| 5|
| A| 5| 5|
| A| 6| 6|
| A| 7| 6|
| A| 8| 6|
| A| 9| 6|
+----+-----+-----+
“value”列的顺序应该如何。@Manish1
值是可选的,可以是任何其他值,但它们必须与原始数据帧的顺序相同。我的意思是最后在7
之后,必须有四个7
。