Transformar un RDD en un dataframe es una habilidad fundamental cuando trabajas con PySpark, ya que te permite aprovechar las ventajas de SQL y las optimizaciones del motor Catalyst. A continuación se explica paso a paso cómo lograrlo: desde limpiar el encabezado del RDD hasta aplicar un esquema tipado y obtener un dataframe listo para consultas.
¿Cómo eliminar el encabezado de un RDD antes de transformarlo?
Cuando un RDD proviene de un archivo CSV, la primera fila suele contener los nombres de las columnas. Ese encabezado debe retirarse antes de cualquier conversión.
Para ello se construye una función llamada elimina_encabezado que recibe dos parámetros:
- índice: la posición de la partición dentro del RDD.
- iterador: los elementos contenidos en esa partición.
Dentro de la función se convierte el iterador a lista y se retorna a partir del segundo elemento (lista[1:]), descartando así la primera fila [01:00].
La función se aplica al RDD mediante mapPartitionsWithIndex, un método que pasa a la función tanto el contenido de cada partición como su índice. De este modo, solo la partición que contiene el encabezado lo elimina [01:37].
python
def elimina_encabezado(indice, iterador):
l = list(iterador)
return iter(l[1:])
deportista_olimpico = deportista_olimpico_rdd.mapPartitionsWithIndex(elimina_encabezado)
Al ejecutar deportista_olimpico.take(5) se confirma que el encabezado ya no aparece.
¿Por qué es necesario transformar los tipos de datos del RDD?
Un RDD creado desde un CSV almacena todo como string. Antes de construir el dataframe es imprescindible convertir cada campo al tipo correcto [02:22].
Se utiliza un map con lambda para recorrer cada registro y aplicar las conversiones:
int() para columnas enteras como el identificador del deportista, la edad, la altura y el equipo.
float() para la columna de peso, que contiene valores decimales.
- Las columnas de texto, como nombre y género, permanecen como string.
python
deportista_olimpico = deportista_olimpico.map(
lambda x: (int(x[0]), x[1], x[2], int(x[3]), int(x[4]), float(x[5]), int(x[6]))
)
Un error frecuente es olvidar la conversión a float en campos decimales, lo que provoca pérdida de precisión o excepciones en tiempo de ejecución.
¿Cómo definir el esquema con StructType y StructField?
El esquema describe la estructura del futuro dataframe: nombre de columna, tipo de dato y si acepta nulos. Se define con StructType, que recibe una lista de objetos StructField [03:10].
python
from pyspark.sql.types import StructType, StructField, IntegerType, StringType, FloatType
esquema = StructType([
StructField("deportista_id", IntegerType(), False),
StructField("nombre", StringType(), False),
StructField("genero", StringType(), False),
StructField("edad", IntegerType(), False),
StructField("altura", IntegerType(), False),
StructField("peso", FloatType(), False),
StructField("equipo_id", IntegerType(), False)
])
El tercer parámetro de cada StructField indica si el campo puede ser nulo. Al establecerlo en False se exige que todos los valores estén presentes, evitando registros incompletos.
¿Cómo aplicar el esquema al RDD para obtener el dataframe?
Con el esquema listo, se utiliza sqlContext.createDataFrame pasando el RDD y el esquema como argumentos [04:30].
python
deportista_df = sqlContext.createDataFrame(deportista_olimpico, esquema)
deportista_df.show()
Si aparece un error de cierre de llaves o tipos incorrectos, revisa que cada StructField esté correctamente escrito y que las conversiones del map coincidan con los tipos declarados en el esquema [04:48].
Una vez creado, el dataframe puede visualizarse con .show() y almacenarse para transformaciones posteriores. Es importante no guardar el dataframe en modo de solo visualización, sino asignarlo a una variable que permita reutilizarlo en operaciones futuras.
Como práctica recomendada, convierte todos los archivos CSV que hayas cargado como RDD a dataframes con sus respectivos esquemas; esto prepara el entorno para trabajar con múltiples fuentes de datos de forma integrada. Si tienes dudas sobre algún paso, compártelas en la sección de comentarios.