Interacción con RDDs en Spark: Operaciones Básicas y Avanzadas

Clase 9 de 25Curso de Fundamentos de Spark para Big Data

Contenido del curso

Data Frames y SQL

Resumen

Trabajar con datos distribuidos requiere dominar las operaciones fundamentales que permiten extraer información valiosa sin comprometer el rendimiento del servidor. A partir de un dataset de equipos olímpicos cargado en un RDD, es posible aplicar transformaciones como map, filter y groupByKey para responder preguntas concretas sobre los datos, siempre respetando la naturaleza inmutable y distribuida de estas estructuras.

¿Cómo contar valores únicos en un RDD con distinct y count?

Una de las primeras operaciones al explorar un RDD es determinar cuántos elementos únicos contiene. En el dataset de equipos olímpicos, cada país tiene una sigla identificadora, pero un mismo país puede tener múltiples equipos internos. Estados Unidos, por ejemplo, cuenta con alrededor de treinta equipos que compiten bajo la misma bandera [01:00].

Para contar cuántos países distintos participan, se utiliza map con una expresión lambda que selecciona la columna de siglas. Los arreglos comienzan en la posición cero, por lo que la sigla se ubica en el índice dos [01:30]. Antes de contar, es indispensable aplicar distinct para eliminar duplicados y obtener una cifra real.

  • Se selecciona la columna deseada con map(lambda x: x[2]).
  • Se aplica distinct() para eliminar valores repetidos.
  • Se ejecuta count() para obtener el total.

Un detalle importante es que las operaciones internas de Spark funcionan con formato llave-valor y procesan mejor las tuplas que las listas [02:28]. Si se intenta usar listas, puede generar errores. El resultado arroja doscientos treinta y un países participantes, aunque esta cifra incluye naciones ya extintas como la Unión Soviética [03:02].

¿Cómo funciona groupByKey junto con map values en RDDs?

La operación groupByKey permite agrupar valores a partir de una llave, de forma similar al GROUP BY de SQL [03:18]. Dado que los RDDs son inmutables, el dataset original no se modifica al realizar transformaciones; cada operación genera una salida nueva sin alterar el RDD original [03:30].

Para agrupar por sigla de país y conocer cuántos equipos posee cada uno, se construye una lambda que selecciona las columnas de sigla y nombre. El orden importa: la llave debe ir primero en la tupla, ya que groupByKey agrupa a partir del primer valor [04:00].

  • map_values permite procesar los valores agrupados sin tocar la llave.
  • Con len se obtiene la cantidad de equipos por país.
  • Con list se visualizan los nombres de los equipos agrupados.

Los resultados muestran que Australia tiene once equipos, México nueve, Argentina dieciocho y Afganistán solo uno [05:10]. En lugar de collect, se utiliza take para traer únicamente los primeros cinco grupos, evitando problemas de rendimiento.

¿Cómo filtrar datos específicos con filter?

Cuando solo interesa un subconjunto, filter permite seleccionar registros que cumplan una condición específica [06:18]. Por ejemplo, para obtener exclusivamente los equipos argentinos, se pasa una lambda que busca coincidencias con "Argentina".

  • Se asigna el resultado a una variable como equipos_argentinos.
  • Al ser un subconjunto pequeño (dieciocho registros), usar collect es aceptable [06:50].

¿Por qué collect puede ser peligroso y cuándo usar count approx?

La operación collect reúne todos los datos distribuidos en la máquina que ejecutó la instrucción [07:05]. Si el RDD contiene mil millones de registros y la máquina solo soporta una fracción, el servidor se ralentiza gravemente.

Una experiencia real ilustra este riesgo: un desarrollador ejecutó collect sobre una tabla con datos desde 1900 en un entorno de producción, lo que alentó toda la red durante casi media hora y afectó procesos críticos [07:40]. La recomendación es clara: nunca ejecutar collect sin conocer el volumen de datos.

Como alternativa al conteo tradicional con count(), existe countApprox [08:40]. Esta función recibe un valor en milisegundos que actúa como límite de tiempo.

  • Si el conteo finaliza antes del límite, devuelve el resultado completo.
  • Si detecta que tardará más, aborta y entrega un conteo parcial.
  • Es ideal cuando no se tiene certeza del tamaño del dataset.

¿Has tenido alguna experiencia con operaciones costosas en entornos distribuidos? Comparte tu caso y cómo lo resolviste.