【发布时间】:2020-12-19 19:11:03
【问题描述】:
我使用的是 Spark 3.0.1,这是我的 pyspark DataFrame 的一个示例:
| label| amount| bool |
-----------------------------
| a | 10 | false |
| a | 2 | false |
| b | 20 | true |
| c | 3 | true |
| d | 2 | false |
| f | 5 | false |
| w | 50 | true |
...
...
这是我用来生成上述示例的代码:
df = spark.createDataFrame(pd.DataFrame({
'label': ["a", "a", "b", "c", "d", "f", "w"],
'amount': [10, 2, 20, 3, 2, 5, 50],
'bool': [False, False, True, True, False, False, True]
}))
我想执行一项在我看来非常简单但我无法完成的任务。
我特别想:
- 按
label排序(已在示例中假设) - 分配给新的
true_label列,值如下:-
label中的值,如果bool是false - 最新的(在
label订购之后)label已经在bool中遇到了false
-
对前面示例的更新应该有助于更好地理解预期结果:
| label| amount| bool | real_label |
-----------------------------------
| a | 10 | false | a | <- because `bool` is false, `real_label` = `label`
| a | 2 | false | a | <- because `bool` is false, `real_label` = `label`
| b | 20 | true | a | <- because `a` the latest `label` with a `false` in `bool`
| c | 3 | true | a | <- because `a` the latest `label` with a `false` in `bool`
| d | 2 | false | d | <- because `bool` is false, `real_label` = `label`
| f | 5 | false | f | <- because `bool` is false, `real_label` = `label`
| w | 50 | true | f | <- because `f` the latest `label` with a `false` in `bool`
...
...
是否有可能在不知道我可以遇到的连续false 的数量的情况下实现我想要的,并且还考虑到真正的数据框非常大并且性能很重要(所以不幸的是,基于 toPandas 的答案是禁止的,也会更好避免udf函数)?
【问题讨论】:
标签: apache-spark pyspark apache-spark-sql window-functions