Solución:
Puede utilizar una función SQL de orden superior AGREGAR (reducir de la programación funcional), así:
import pyspark.sql.functions as F
df = df.select(
'name',
F.expr('AGGREGATE(scores, 0, (acc, x) -> acc + x)').alias('Total')
)
El primer argumento es la columna de la matriz, el segundo es el valor inicial (debe ser del mismo tipo que los valores que suma, por lo que es posible que deba usar “0.0” o “DOBLE (0)”, etc. si sus entradas no son números enteros) y el tercer argumento es una función lambda, que agrega cada elemento de la matriz a una variable acumuladora (al principio, se establecerá en el valor inicial 0).
La transformación se ejecutará en un solo operador de proyección, por lo que será muy eficiente. Además, no necesita conocer el tamaño de las matrices de antemano y la matriz puede tener una longitud diferente en cada fila.
En caso de que no conozca la longitud de la matriz (como en su ejemplo):
import pyspark.sql.functions as F
psaudo_counts = df.select('name').distinct().withColumn('score', F.lit(0))
df = df.select('name', F.explode('scores').alias('score')).unionByName(psaudo_counts)
df = df.groupby('name').agg(F.sum('name').alias('Total'))
En caso de que conozca la longitud de la matriz:
import pyspark.sql.functions as F
length_of_array = 3
df = df.select('name', sum([F.col('scores').getItem(i) for i in range(length_of_array)]).alias('Total'))
Gracias por cricket_007 por la sugerencia y este correo antiguo por la idea de longitud fija.