我在spark中有一个DataFrame,看起来像这样:
id | flag
----------
0 | true
1 | true
2 | false
3 | true
4 | true
5 | true
6 | false
7 | false
8 | true
9 | false
我想获取另一个列,如果它有flag == false
,或者下一个false值的rowNumber,那么它的当前rowNumber,所以输出会像这样:
id | flag | nextOrCurrentFalse
-------------------------------
0 | true | 2
1 | true | 2
2 | false | 2
3 | true | 6
4 | true | 6
5 | true | 6
6 | false | 6
7 | false | 7
8 | true | 9
9 | false | 9
我想以向量化的方式来做这件事(而不是按行迭代)。所以我实际上想要的逻辑是:
- 对于每一行,获取大于或等于当前行的最小id,该id具有标志== false
3条答案
按热度按时间y53ybaqx1#
在考虑了扩展等问题之后--但不清楚Catalyst是否足够好--我提出了一个解决方案,该解决方案基于一个可以从分区中受益的答案,并且只需考虑数据即可。它是关于预计算和处理的,一些按摩可以击败蛮力方法。你关于JOIN的观点不是一个问题,因为这是一个有界的JOIN,没有大量的数据生成。
你对框架方法的评论有点厌倦,因为所有超过这里的都是框架。我想你的意思是你想循环通过一个 Dataframe ,并有一个子循环与出口。我找不到这样的例子,事实上,我不确定它是否符合SPARK范式。同样的结果,更少的处理:
还返回:
x6492ojm2#
如果
flag
相当稀疏,你可以这样做:在第一步中,我们为标志为false的id创建一个框架。然后,我们在所需的条件下将该嵌套框架连接到原始数据(原始id应小于或等于flag为false的行的id)。
要获得 first 这种情况,请按id分组并使用
agg
查找id1
的最小值(这是flag = false的行的id)。在示例数据上运行(并按id排序)会得到所需的输出:
如果DataFrame非常大,并且有许多行的标志为False,则这种方法可能会遇到性能问题。如果是这种情况,您可能会更好地使用迭代解决方案。
ukqbszuj3#
看看其他的答案哪个更好,但是把这个留在这里是为了SQL教育的目的-可能的。
这是你想要的,但我很想知道其他人对这一点的看法。我将检查催化剂,看看它是如何工作的程序,但我认为这可能意味着一些错过分区边界,我热衷于检查,以及。