(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Cómo usar explode en PySpark: expandir arrays en filas

João Barros 09 de July de 2026 4 min de lectura

Muchas fuentes de datos guardan varios valores dentro de una sola celda en forma de array — por ejemplo, la lista de productos de cada pedido o las etiquetas de un artículo. Mientras los datos siguen "atrapados" dentro del array, es difícil contarlos, filtrarlos o unirlos a otras tablas. En PySpark, la función explode convierte cada elemento del array en su propia fila, y es una de las herramientas más útiles para "aplanar" estructuras anidadas antes de agregar o filtrar. Es una operación muy común con datos que vienen de APIs o de archivos JSON, donde los campos repetidos casi siempre llegan como listas dentro de una sola columna.

Requisitos previos

  • Un entorno con PySpark instalado (Databricks, Microsoft Fabric o Spark local).
  • Una SparkSession activa (en los notebooks ya existe como spark).
  • Conocimientos básicos de DataFrames: crear uno, verlo con show() y seleccionar columnas.

Paso 1: Crear un DataFrame con una columna de array

Para el ejemplo, vamos a crear un pequeño DataFrame donde cada fila representa un pedido y la columna produtos contiene una lista de artículos. Así podemos ver el efecto de explode sin depender de datos externos.

from pyspark.sql import SparkSession
from pyspark.sql.functions import explode

spark = SparkSession.builder.getOrCreate()

dados = [
    (1, ["teclado", "rato", "monitor"]),
    (2, ["portátil"]),
    (3, []),
]
df = spark.createDataFrame(dados, ["encomenda_id", "produtos"])
df.show(truncate=False)

El resultado muestra tres filas, cada una con un array en la columna produtos. Fíjate en que el pedido 3 tiene un array vacío — más adelante veremos por qué es importante.

Paso 2: Aplicar explode para expandir el array

La función explode crea una fila por cada elemento del array. La usamos dentro de un select (o withColumn) para generar una nueva columna con los valores individuales.

from pyspark.sql.functions import explode

resultado = df.select("encomenda_id", explode("produtos").alias("produto"))
resultado.show(truncate=False)

Ahora cada producto aparece en su propia fila, manteniendo el encomenda_id correspondiente. El pedido 1, que tenía tres productos, ahora ocupa tres filas. Fíjate en que las demás columnas del select se repiten para cada elemento — así es como explode conserva el contexto de cada valor.

Paso 3: Mantener las filas con arrays vacíos o nulos

Hay un detalle importante: explode elimina las filas cuyo array está vacío o es nulo. Por eso el pedido 3 desapareció del resultado. Si necesitas conservar esas filas (con un valor nulo en la nueva columna), usa explode_outer.

from pyspark.sql.functions import explode_outer

df.select("encomenda_id", explode_outer("produtos").alias("produto")).show(truncate=False)

Con explode_outer, el pedido 3 se mantiene en el resultado, con null en la columna produto. Esta diferencia es fácil de olvidar y suele explicar por qué "faltan" registros después de un explode.

Consejo: si no estás seguro de si una columna puede contener nulos, usa explode_outer por defecto. Es más seguro que descubrir más tarde que perdiste filas.

Paso 4: Obtener también la posición de cada elemento

A veces queremos saber el orden en el que aparecía cada valor en el array. La función posexplode devuelve dos columnas: la posición (empezando en 0) y el valor.

from pyspark.sql.functions import posexplode

df.select("encomenda_id", posexplode("produtos").alias("posicao", "produto")).show(truncate=False)

Esto es útil, por ejemplo, para identificar el primer producto de cada pedido (posición 0) o para reconstruir el orden original más tarde. Igual que explode, también existe la variante posexplode_outer para mantener las filas vacías o nulas.

Verificar el resultado

Para confirmar que la expansión funcionó, compara el número de filas antes y después. La suma de los tamaños de los arrays debe coincidir con el total de filas después de explode (con explode_outer, se suman también las filas vacías o nulas).

print("Linhas originais:", df.count())
print("Linhas apos explode:", resultado.count())
resultado.groupBy("encomenda_id").count().show()

Si los números cuadran y cada encomenda_id tiene el número de productos esperado, la operación es correcta.

Conclusión

Con explode, explode_outer y posexplode ya puedes aplanar arrays en filas y elegir si quieres conservar los registros vacíos o no. El siguiente paso natural es combinar explode con groupBy para contar cuántas veces aparece cada producto, o aplicar la misma idea a estructuras más complejas. ¿Has pensado en cómo usarías explode_outer para no perder pedidos sin productos en tus informes?