我有一个PySpark数据表,如下所示
shouldMerge | number
true | 1
true | 1
true | 2
false | 3
false | 1
我想将所有shouldMerge为true的列合并起来,然后将数字相加。你知道吗
所以最终的输出看起来像
shouldMerge | number
true | 4
false | 3
false | 1
如何选择shouldMerge==true的所有行,将这些数字相加,并在PySpark中生成新行?你知道吗
编辑:另一个稍微复杂一点的场景,更接近我要解决的问题,我们只聚合正数:
mergeId | number
1 | 1
2 | 1
1 | 2
-1 | 3
-1 | 1
shouldMerge | number
1 | 3
2 | 1
-1 | 3
-1 | 1
IIUC,你想做一个
groupBy
,但只在正的mergeId
上一种方法是过滤数据帧中的正id、group、aggregate,并将其与负的
id
合并(类似于@shanmuga's answer)。你知道吗另一种方法是使用
when
动态创建分组键。如果mergeId
为阳性,则使用mergeId
进行分组。否则,请使用monotonically_increasing_id
来确保该行不会被聚合。你知道吗举个例子:
通过改变
when
条件(在本例中是f.col("mergeId") > 0
)来满足您的特定需求,可以很容易地概括这一点。你知道吗解释:
首先,我们创建一个临时列
uid
,它是每一行的唯一ID。接下来,我们调用groupBy
,如果mergeId
为正,则使用mergeId
进行分组。否则我们使用uid
作为mergeKey
。我还将mergeId
作为第二个groupby列传入,作为为输出保留该列的方法。你知道吗要演示正在进行的操作,请查看中间结果:
如您所见,
mergeKey
仍然是负的mergeId
的唯一值在这个中间步骤中,所需的结果只是一个简单的group by and sum,然后删除
mergeKey
列。你知道吗您必须只筛选出应该合并为
true
并聚合的行。然后将其与所有剩余行合并。你知道吗OP发布的第一个问题。
对于OP发布的第二个问题
文档:lag()-返回当前行之前偏移行的值。你知道吗
相关问题 更多 >
编程相关推荐