Dominando Apache Spark (VI): Diferentes tipos de Joins en DataFrames con ejemplos en PySpark

Nov 9, 2023 | Big Data, Python | 0 Comentarios

En el emocionante mundo de Apache Spark, la manipulación y el análisis de datos son tareas comunes. Los joins, que implican combinar conjuntos de datos basados en una clave común, son esenciales para descubrir información valiosa a partir de datos dispersos. Spark facilita esta tarea a través de sus DataFrames, y en este artículo, exploraremos los diferentes tipos de joins disponibles en Spark con ejemplos prácticos en PySpark.

 

Tipos de Joins en DataFrames

Inner Join

Un inner join es un tipo de join que devuelve solo los registros que tienen coincidencias en ambas tablas. Es útil para combinar datos que tienen un valor clave en común.

Ejemplo en PySpark

Supongamos que tenemos dos DataFrames: «ventas» y «clientes». Queremos combinarlos para obtener información sobre las ventas realizadas por cada cliente.

from pyspark.sql import SparkSession

# Crear una SparkSession
spark = SparkSession.builder.appName("join_example").getOrCreate()

# Crear DataFrames de ejemplo
df_ventas = spark.createDataFrame([(1, "Producto A", 100), (2, "Producto B", 150)], ["venta_id", "producto", "monto"])
df_clientes = spark.createDataFrame([(1, "Cliente 1"), (3, "Cliente 3")], ["cliente_id", "nombre"])

# Realizar un inner join
resultado = df_ventas.join(df_clientes, df_ventas.venta_id == df_clientes.cliente_id, "inner")

# Mostrar el resultado
resultado.show()
+-------+------------+-------+---------+
|venta_id|producto    |monto  |producto_id|
+-------+------------+-------+---------+
|1      |Producto A  |100    |1         |
|2      |Producto B  |150    |2         |
+-------+------------+-------+---------+

En este resultado, se muestran las ventas y los productos asociados. Las filas están relacionadas por la columna producto_id.

 

Right Join

Un right join es similar al left join, pero devuelve todos los registros de la tabla derecha y las coincidencias de la tabla izquierda. Los registros sin coincidencia en la tabla izquierda tendrán valores nulos en las columnas correspondientes.

Ejemplo en PySpark:

Supongamos que queremos obtener todos los clientes y las ventas asociadas, si las hay.

# Realizar un right join 
resultado = df_ventas.join(df_clientes, df_ventas.venta_id == df_clientes.cliente_id, "right") 
# Mostrar el resultado 
resultado.show()
+-------+------------+-------+---------+
|venta_id|producto    |monto  |producto_id|
+-------+------------+-------+---------+
|1      |Producto A  |100    |1         |
|2      |Producto B  |150    |2         |
|null   |Producto D  |null   |4         |
|null   |Producto E  |null   |5         |
+-------+------------+-------+---------

En este resultado, se muestran todos los productos y las ventas asociadas cuando están disponibles. Las dos primeras filas son ventas asociadas con productos, y las dos últimas filas son productos que no tienen ventas asociadas. Los valores nulos en venta_id y monto indican la falta de ventas para esos productos.

 

Full Outer Join

Un full outer join devuelve todos los registros de ambas tablas y completa con valores nulos donde no hay coincidencias.

Ejemplo en PySpark

Al igual que antes, supongamos que queremos obtener todas las ventas y todos los clientes, incluyendo las coincidencias si las hay.

# Realizar un left semi join 
resultado = df_ventas.join(df_clientes, df_ventas.venta_id == df_clientes.cliente_id, "leftsemi") 
# Mostrar el resultado 
resultado.show() 
+-------+------------+-------+---------+
|venta_id|producto |monto |producto_id|
+-------+------------+-------+---------+
|1 |Producto A |100 |1 |
|2 |Producto B |150 |2 |
|3 |Producto C |200 |null |
|null |Producto D |null |4 |
|null |Producto E |null |5 |
+-------+------------+-------+---------+

En este resultado, se muestran todas las ventas y los productos, incluyendo aquellos que no tienen una coincidencia en el otro DataFrame. Las dos primeras filas son ventas asociadas con productos, la tercera fila muestra un producto sin venta asociada, y las dos últimas filas son productos sin ventas asociadas. Los valores nulos indican la falta de coincidencia en una de las tablas.

 

Left Anti Join

Un left anti join devuelve todas las filas de la tabla izquierda que no tienen coincidencias en la tabla derecha. Es útil para identificar registros que no tienen correspondencia en la otra tabla.

Ejemplo en PySpark

Supongamos que queremos encontrar ventas realizadas por clientes que no existen en la base de datos.

# Realizar un left anti join
resultado = df_ventas.join(df_clientes, df_ventas.venta_id == df_clientes.cliente_id, "leftanti")

# Mostrar el resultado
resultado.show()
+----------+--------+
|cliente_id|nombre |
+----------+--------+
|3 |Cliente 3|
|4 |Cliente 4|
+----------+--------+

 

Left Semi Join

Un left semi join devuelve todas las filas de la tabla izquierda para las cuales hay al menos una coincidencia en la tabla derecha. No incluye las filas de la tabla derecha en el resultado.

Ejemplo en PySpark

Supongamos que queremos obtener todas las ventas realizadas por clientes existentes.

# Realizar un right join 
resultado = df_ventas.join(df_clientes, df_ventas.venta_id == df_clientes.cliente_id, "right") 
# Mostrar el resultado 
resultado.show()

 

En este artículo, exploramos los diferentes tipos de joins disponibles en DataFrames de Spark, desde el tradicional inner join hasta opciones más especializadas como left semi join y left anti join. Cada tipo de join tiene su propósito y aplicación específicos, lo que permite un análisis de datos detallado y efectivo.

Comprender cómo y cuándo utilizar cada tipo de join es fundamental para realizar un análisis de datos completo y preciso. En el próximo artículo de esta colección, nos sumergiremos en las funciones avanzadas para cargar y exportar datos en PySpark, lo que ampliará nuestras capacidades para gestionar y procesar datos de manera eficiente. ¡No te lo pierdas!

A continuación tenéis todas las publicaciones de esta serie hasta ahora:

También te puede interesar:

5 trucos para Jupyter Notebook que no debes perderte

Descubre 5 trucos para Jupyter Notebook no tan conocidos que te ayudarán familiarizarte más con esta herramienta y ser más eficiente.

Extracción de datos de sitios web con Scrapy (I): recopilando información de productos de Zara

En este tutorial explicamos como extraer con Scrapy los datos de la web de Zara de forma automatizada para finalmente almacenarlos en MongoDB.

Otros 5 trucos de Jupyter Notebook que probablemente desconozcas

En este artículo se explican 5 nuevos trucos para Jupyter Notebook que probablemente desconozcas y que mejorarán vuestra productividad.

Extracción de datos de sitios web con Scrapy (II): rastreando todas las URLs del sitio web de Zara

En este post construimos un rastreador con Scrapy que extrae los datos de manera recursiva todas las URLs del sitio web de Zara.

Extracción de datos de Twitter con Python (sin consumir la API)

En esta publicación os enseñaremos como poder extraer datos de Twitter en Python mediante la librería Twint. De esta forma, podremos obtener facilmente los últimos tweets que contengan cierta palabra o que pertenezcan a un determinado usuario y aplicar varios filtros.

Aplicación de la Distribución t de Student en Python: Ejemplos prácticos

Distribución t en Python: Aprende cómo aplicar la Distribución t en Python con ejemplos para pruebas de hipótesis e intervalos de confianza.

Dominando Apache Spark (I): Introducción y ventajas en el procesamiento de grandes volúmenes de datos

En el artículo, exploramos la historia y ventajas de Apache Spark como un marco de procesamiento de datos de código abierto. Destacamos su evolución y las razones para su popularidad en el procesamiento de datos a gran escala, incluyendo su velocidad y capacidad de procesamiento en memoria.

Las tendencias de Big Data y Machine Learning que dominarán en 2024

Descubre las tendencias de Big Data y Aprendizaje Automático que marcarán el rumbo en 2024, y cómo prepararte para el futuro tecnológico en este artículo informativo.

Dominando Apache Spark (II): Funcionamiento interno y arquitectura

En este artículo profundizamos en la arquitectura y el funcionamiento interno de Spark, destacando componentes clave.

Dominando Apache Spark (III): Explorando RDD (Resilient Distributed Datasets) y su poder en el procesamiento de datos

En este artículo exploramos RDD, una estructura fundamental para el procesamiento de datos distribuidos. Descubre cómo RDDs permiten la manipulación y transformación de datos a gran escala.

Ads Blocker Image Powered by Code Help Pro

Por favor, permite que se muestren anuncios en nuestro sitio web

Querido lector,

Esperamos que estés disfrutando de nuestro contenido. Entendemos la importancia de la experiencia sin interrupciones, pero también queremos asegurarnos de que podamos seguir brindándote contenido de alta calidad de forma gratuita. Desactivar tu bloqueador de anuncios en nuestro sitio nos ayuda enormemente a lograrlo.

¡Gracias por tu comprensión y apoyo!