Eu tenho a seguinte tabela
Equipe | Equipe_Categoria | Pontuação1 | Pontuação2 | Pontuação3 | Pontuação4 | Pontuação 5 | Pontuação 6 | Pontuação7 | Pontuação8 |
---|---|---|---|---|---|---|---|---|---|
A41 | Bicicletas | 40 | 91 | 51 | |||||
A57 | Bicicletas | 60 | 47 |
Quero deslocar os valores para a esquerda se uma pontuação anterior for NULL
ou ""
A saída necessária for:
Equipe | Equipe_Categoria | Pontuação1 | Pontuação2 | Pontuação3 | Pontuação4 | Pontuação 5 | Pontuação 6 | Pontuação7 | Pontuação8 |
---|---|---|---|---|---|---|---|---|---|
A41 | Bicicletas | 40 | 91 | 51 | |||||
A57 | Bicicletas | 60 | 47 |
Eu tentei usar coalesce
like
spark.sql("""SELECT Team, Team_Category, COALESCE(NULLIF(Score1,""),NULLIF(Score2,""),...NULLIF(Score8,"")) AS Score1, COALESCE(NULLIF(Score2,""),NULLIF(Score3,"")...NULLIF(Score8,"")) AS Score2,...""")
mas isso resolveria apenas metade do problema. Mesmo que os valores sejam agora movidos para a esquerda, os valores à direita ainda estarão lá.
Como isso pode ser feito usando spark sql?
Observação: uma equipe pode ter diversas linhas, mas elas são independentes umas das outras.
Crie uma matriz a partir das
Score
colunas e use-aarray_compact
para remover nulos, finalmente, com base na nova posição de cada elemento na matriz, reatribua as colunas de pontuação de volta ao dataframeNota:
array_compact
só está disponível a partir do spark 3.4.0 se você estiver usando uma versão antiga, então podemos usarfilter
:arr = F.filter(F.array(*cols), lambda x: x.isNotNull())