Saltar al contenido

pyspark: la mejor forma de sumar valores en una columna de tipo Array(Integer())

Ya no tienes que buscar más en otras webs ya que llegaste al sitio exacto, tenemos la respuesta que necesitas y sin complicaciones.

Solución:

Puede usar una función SQL de orden superior AGGREGATE (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 el array columna, 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 suma cada elemento de la array 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 saber el tamaño de las matrices de antemano y el array puede tener diferente longitud en cada fila.

En caso de que no sepa la longitud de la array (como en tu 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 sepa la longitud de la array:

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

Te invitamos a añadir valor a nuestro contenido tributando tu experiencia en las explicaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *