¿Qué son los data frames y por qué son tan valiosos?
Los data frames son fundamentales en el manejo de datos estructurados en grandes cantidades. Su importancia radica en que pueden tratar datos como si fueran tablas de una base de datos. A través de data frames, accedemos y manipulamos columnas de datos directamente por su nombre, sin necesidad de índices. Además, cuentan con un motor de optimización, Catalyst, que corrige errores al ejecutar consultas. Esta optimización, junto con el motor de ejecución TUXTEN de Spark 3, mejora considerablemente el rendimiento de las operaciones de datos.
¿Cómo crear un data frame en Jupyter con Spark?
Comenzar a trabajar con data frames en Jupyter requiere importar librerías necesarias de Spark, como SparkContext y la SparkSession. Además, es clave conocer las diferencias entre distintos contextos SQL. Aquí incluimos un ejemplo básico de la creación de un data frame a partir de un archivo CSV:
from pyspark import SparkContext
from pyspark.sql import SQLContext
from pyspark.sql.types import StructType, StructField, IntegerType, StringType
# Inicialización del Spark y SQL contextsc = SparkContext("local","DataFrames")sqlContext = SQLContext(sc)# Definición del schemajuegoSchema = StructType([ StructField("juegoID", IntegerType(),False), StructField("nombre", StringType(),False), StructField("año", StringType(),False), StructField("temporada", StringType(),False), StructField("ciudad", StringType(),False)])# Creación del DataFrame a partir de un CSVjuegoDataFrame = sqlContext.read.format("csv") \
.option("header","true") \
.schema(juegoSchema) \
.load("ruta_del_archivo/juegos.csv")# Mostrar el contenido del DataFramejuegoDataFrame.show()
Este código muestra cómo definir un esquema y cargar un archivo CSV en un data frame, asegurando que las columnas tengan el tipo de dato correcto.
¿Cómo optimizar la ejecución de data frames?
Un aspecto destacado de los data frames es su optimización automática mediante Catalyst. Cuando creamos y manipulamos data frames en Spark, Catalyst verifica el código internamente para asegurar su corrección, y efectúa tareas de optimización como el escaneo automatizado de particiones. La interfaz gráfica de Spark, accesible en el puerto 4040 del localhost, permite monitorear estas optimizaciones.
Otros consejos y recomendaciones:
Mantén organizada tu libreta en Jupyter: Asegúrate de cerrar sesiones anteriores para evitar confusiones con el acceso a interfaces de monitoreo.
Utiliza el motor optimizador de Catalyst: Aprovecha la capacidad de Catalyst para gestionar y corregir las consultas de manera eficiente.
Comprende el esquema de los datos: Definir correctamente el esquema ayuda a evitar errores durante la carga y manipulación de datos.
Ojo, SQLContext se usa para compatibilidad con versiones viejas y hoy día está obsoleto desde la versión 2.0; se recomienda trabajar con el objeto de sesión (SparkSession)
%alias head powershell -command "& {Get-Content '/Spark Most Current/Platzi - Spark/curso-apache-spark-platzi-master/files/juegos.csv' -Head 10}"%head "/Spark Most Current/Platzi - Spark/curso-apache-spark-platzi-master/files/juegos.csv"```
De que me sirve a mi definir el schema? no sería más fácil simplemente leer el csv con read.load que viene en el sparksession?o tiene algun cambio en eficiencia si le doy el schema del dataset?
Si, puedes usar cualquiera de las dos alternativas para leer el archivo
La ventaja de definir un esquema y usarlo para cargar un archivo es el control. En un esquema puedes definir qué tipos de datos estás esperando para qué columnas, mientras que si lees de la otra forma el archivo Spark trata de inferir los tipos y el esquema por su cuenta
Es un tema meramente de performance. Al no pasar el schema, Spark va a leer dos veces el archivo/s, una para inferir el schema (columnas y tipos de datos) y otra para leer los datos en sí.
Siempre conviene pasar un esquema además porque permite tener control sobre el flujo y da un pantalla rápido con que datos se están trabajando.
En la versión de Hadoop de 3.0.0 en adelante, la funcion de SQLContext va a ser deprecada, por lo tanto, esta función podría dejar de funcionar, según entiendo:
Te recomiendan usar el SparkSession para esto, de la siguiente forma. Una vez que ya creaste tu SparkSession, yo la creé como spark2 y queda así :
spark2.read.csv(path+"juegos.csv", schema = juego_schema, header = False)
A partir de este punto, puedes utilizar tanto SparkContext (sc) como SparkSession (spark) para operaciones con Spark y DataFrames.
En el minuto 3:24 se usan diferentes import del mismo paquete solo para que todo quepa horizontalmente en la pantalla, eso no es necesario, pero una alternativa a eso podría ser poner los imports entre paréntesis:
from pyspark.sql.typesimport(StructType,StructField,IntegerType,StringType,Row,FloatType)
Buenas, alguien sabe como crear un Dataframe a partir de txt cuando los espacios de separación entre columnas vienen datos a intervalos fijos. Por ejemplo, col1 con 20 espacios, col2 con 30 espacios, col3 con 3 espacios.... querria definir un dataframe a partir de ese txt y luego añadirle un encabezado apartir de un esquema que ya tengo.
Saludos
Hola! Pudiste resolver el problema? Me gustaria conocer el modo en el que pudiste encontrar la solucion. La unica manera que se me viene a la cabeza es con loops
A mi se me ocurre que con python podrías hacer un split de cada linea de tu txt e ir llenando el dataframe. Quizá con un esto dentro de un loop que tiene como tope el número de líneas de tu texto.
Tengo una duda, y quiza sea algo básico, pero ¿Es obligatorio usar Jupyter para todo lo que tenga que ver con Pyspark o se puede usar algún otro editor de código?
Hola! Alguien sabe la diferencia entre SparkContext y SparkSession? Gracias!
Spark: Why should we use SparkSession ?
El constructor de dataframes es pandas.DataFrame. Acepta cuatro parámetros principales:
data: estructura de datos ndarray (array NumPy), diccionario u otro dataframe
index: índice a aplicar a las filas. Si no se especifica, se asignará uno por defecto formado por números enteros entre 0 y n-1, siendo n el número de filas del dataframe.
columns: etiquetas a aplicar a las columnas. Al igual que ocurre con el índice de filas, si no se añade se asignará uno automático formado por números enteros entre 0 y n-1, siendo n el número de columnas.
dtype: tipo a aplicar a los datos. Solo se permite uno. Si no se especifica, se infiere el tipo de cada columna a partir de los datos que contengan.
Los valores de los índices de filas y columnas no tienen por qué ser necesariamente distintos.
No es así, son distintos, pyspark no usa pandas ni numpy nativamente, son librerías que se instalan encima del mismo en caso de que se quieran utilizar.
Mi grafo tiene los pasos en otro orden, ¿alguien sabe por qué?