我有下表
团队 | 团队_类别 | 分数1 | 分数2 | 分数3 | 分数4 | 分数5 | 分数6 | 分数7 | 分数8 |
---|---|---|---|---|---|---|---|---|---|
A41 | 自行车 | 40 | 91 | 51 | |||||
A57 | 自行车 | 60 | 47 |
NULL
如果以前的分数是或 ,我想左移这些值""
所需的输出是:
团队 | 团队_类别 | 分数1 | 分数2 | 分数3 | 分数4 | 分数5 | 分数6 | 分数7 | 分数8 |
---|---|---|---|---|---|---|---|---|---|
A41 | 自行车 | 40 | 91 | 51 | |||||
A57 | 自行车 | 60 | 47 |
我尝试使用coalesce
像
spark.sql("""SELECT Team, Team_Category, COALESCE(NULLIF(Score1,""),NULLIF(Score2,""),...NULLIF(Score8,"")) AS Score1, COALESCE(NULLIF(Score2,""),NULLIF(Score3,"")...NULLIF(Score8,"")) AS Score2,...""")
但这只能解决一半问题。尽管这些值现在将移至左侧,但右侧的值仍然存在。
如何使用 Spark sql 来完成此操作?
注意:一个团队可以有多行,但它们是相互独立的。
从
Score
列创建一个数组,然后array_compact
根据数组中每个元素的新位置最终删除空值,将分数列重新分配回数据帧注意:
array_compact
仅从 Spark 3.4.0 开始可用,如果您使用的是旧版本,那么我们可以使用filter
:arr = F.filter(F.array(*cols), lambda x: x.isNotNull())