Curso
PySpark se une: Optimizar el rendimiento de las uniones Big Data
PySpark es la API de Python para Apache Spark, diseñada para el procesamiento paralelo y distribuido de datos en clusters. Elegir la operación de unión correcta para tus necesidades afecta a la velocidad del trabajo, al consumo de recursos y al éxito general.
Trabajar con amplios conjuntos de datos a menudo significa integrar datos de varias fuentes. Combinar eficazmente esta información es esencial para un análisis preciso y unas perspectivas significativas. Las uniones de PySpark proporcionan potentes formas de combinar conjuntos de datos separados basándose en claves compartidas.
Sin embargo, las uniones ineficaces pueden afectar gravemente a la velocidad y fiabilidad del procesamiento de datos cuando se trata de grandes conjuntos de datos que contienen millones o incluso miles de millones de registros en clústeres distribuidos.
¿Has experimentado uniones que fallan con análisis lentos o incluso con datos a gran escala? Si es así, esta guía es para ti. Ayudará a los científicos de datos, desarrolladores e ingenieros intermedios a adquirir dominio y confianza a la hora de realizar uniones en PySpark.
Si estás buscando algunos ejercicios prácticos para familiarizarte con PySpark, consulta nuestro Curso sobre Big Data con PySpark.
¿Qué son las uniones PySpark?
Como descubrirás en nuestro Aprende PySpark desde cero una de las principales características de PySpark es la capacidad de fusionar grandes conjuntos de datos. Las operaciones de unión de PySpark son esenciales para combinar grandes conjuntos de datos basados en columnas compartidas, permitiendo una integración, comparación y análisis de datos eficientes a escala.
Desempeñan un papel fundamental en la gestión de los macrodatos, ya que ayudan a descubrir relaciones y a extraer perspectivas significativas de las fuentes de datos distribuidas.
PySpark ofrece varios tipos de uniones, como uniones internas, uniones externas, uniones a izquierda y derecha, semiuniones y antiunionescada una de las cuales sirve para distintos fines analíticos.
Sin embargo, trabajar con uniones en grandes conjuntos de datos puede plantear retos como datos sesgados, sobrecarga de barajado y limitaciones de memoria, lo que hace que sea crucial seleccionar la estrategia de unión adecuada para el rendimiento y la precisión.
Fundamentos de las uniones PySpark
Comprender las operaciones internas de PySpark es vital para unir eficientemente grandes conjuntos de datos, como mostramos en nuestro curso de Curso de Introducción a PySpark. Esta sección esboza el marco conceptual que subyace a la ejecución conjunta de PySpark y el papel de su optimizador.
Marco conceptual
PySpark realiza uniones en un entorno informático distribuido, lo que significa que divide grandes conjuntos de datos en particiones más pequeñas y las procesa en paralelo en un clúster de máquinas. Cuando se activa unaunión , PySpark distribuye el trabajo entre estos nodos, buscando un cálculo equilibrado para acelerar la ejecución y evitar cuellos de botella.
En el núcleo de este proceso se encuentra Catalyst, el potente motor de optimización de consultas de Spark. El catalizador determina cómo se ejecutan las operaciones de unión. Decide las estrategias de partición, detecta cuándo es necesario barajar los datos y aplica optimizaciones de rendimiento como el pushdown de predicados y las uniones de difusión. Esta optimización automatizada garantiza una ejecución eficaz sin necesidad de ajuste manual por parte del desarrollador.
Sintaxis de unión básica
Para realizar uniones en PySpark, hay que seguir una sintaxis sencilla que implica especificar los marcos de datos, a condición de unióny el tipo de unión a ejecutar.
from pyspark.sql import SparkSession
# Initialize Spark session
spark = SparkSession.builder.appName("PySpark Joins Example").getOrCreate()
# Perform a join
joined_df = df1.join(df2, on="key", how="inner")
En este ejemplo:
df1
ydf2
son los DataFrames que hay que unir.df1.key
==df2.key
es la condición de unión, que determina cómo deben emparejarse las filas de cada DataFrame.inner' specifies the join type, which could also be
izquierda,
derecha,,
exterior,
semi, or
anti` según el resultado deseado.
Sigue nuestro tutorial Introducción a PySpark para obtener instrucciones sobre cómo instalar PySpark y ejecutar las uniones anteriores sin errores.
Tipos de uniones y aplicaciones de PySpark
PySpark incluye diferentes tipos de uniones, cada una adecuada para tareas de datos distintas. Comprenderlos te ayudará a elegir sabiamente.
Juntas interiores
La unión interna combina filas de dos Marcos de Datos cuando existen claves coincidentes en ambos. Se excluirán las filas sin claves coincidentes. Es el tipo de unión más común y por defecto en PySpark.
Los escenarios de uso típicos incluyen:
- Cotejar los pedidos de los clientes con sus perfiles para obtener informes analíticos precisos.
- Comparar con precisión conjuntos de datos de distintas fuentes.
Uniones exteriores
PySpark admite uniones a la izquierda, a la derecha y externas completas.
La unión externa izquierda devuelve todas las filas del Marco de Datos izquierdo y las filas coincidentes del Marco de Datos derecho. Cuando no aparece ninguna clave coincidente en el Marco de datos derecho, los valores nulos llenan las columnas de la derecha.
Casos prácticos:
- Encontrar clientes que no han comprado.
- Identificar la información que falta en los registros.
La unión externa derecha refleja la lógica de la unión izquierda. Devuelve todas las filas del Marco de datos derecho y las filas coincidentes del Marco de datos izquierdo, rellenando con nulos las coincidencias que falten en las columnas de la izquierda.
Ejemplo de situación:
- Comprobar la asignación de categorías de productos o los errores de etiquetado.
La unión externa completa devuelve todas las filas disponibles de ambos marcos de datos, rellenando las entradas no coincidentes con nulos. Ayuda a detectar discrepancias o lagunas de datos entre dos conjuntos de datos.
Uniones especializadas: Semiempalmes y antiempalmes
Las semi-uniones y anti-uniones cumplen funciones especializadas:
Una semiunión devuelve filas del Marco de Datos izquierdo donde existen claves coincidentes en el Marco de Datos derecho. No añade columnas del DataFrame correcto y evita duplicados, por lo que es ideal para comprobaciones de existencia.
Ejemplo de caso práctico:
- Comprueba rápidamente los historiales de acceso de los usuarios sin detalles adicionales.
Una antiUnión devuelve filas de un Marco de Datos que no tienen una clave coincidente en el segundo Marco de Datos.
Ejemplo de caso práctico:
- Encontrar registros huérfanos o validar la integridad de los datos.
Las uniones cruzadas crean datos emparejando cada fila de un Marco de datos con cada fila de otro. A menos que se desee específicamente, evita las uniones cruzadas, ya que amplían drásticamente los conjuntos de datos.
Utilízalos con precaución para situaciones concretas como:
- Probar combinaciones de parámetros.
- Analizar todos los emparejamientos posibles en entornos experimentales.
Técnicas de optimización para uniones eficientes en PySpark
Las uniones a gran escala exigen una optimización cuidadosa. Considera las siguientes técnicas:
Difusión de la estrategia de unión
Las uniones por difusión mejoran el rendimiento al replicar los DataFrames más pequeños en todos los nodos, eliminando las costosas barajadas.
Ejemplo de sintaxis:
from pyspark.sql.functions import broadcast
joined_df = large_df.join(broadcast(small_df), "id", "inner")
Ten en cuenta los límites de memoria de tu sistema; la difusión de DataFrames excesivamente grandes no funcionará eficazmente.
Técnicas de mitigación de la desviación
La desviación de datos significa que los datos no se distribuyen uniformemente entre las particiones, lo que crea cuellos de botella. Las técnicas para reducir la desviación incluyen
- Salado de claves: adjuntar prefijos aleatorios a claves de unión muy sesgadas para conseguir una distribución uniforme.
- Partición en función de la inclinación: Spark equilibra automáticamente los datos entre particiones, gestionando proactivamente la asimetría desde el principio.
Estrategias de partición
El rendimiento eficiente de las uniones en PySpark depende en gran medida de la minimización de la sobrecarga de barajado, que se produce cuando hay que mover datos entre nodos para satisfacer las condiciones de unión. Una de las formas más eficaces de reducir esta sobrecarga es alinear las particiones de los DataFrames que se van a unir.
Buenas prácticas para la partición
Ten en cuenta estas buenas prácticas:
- Para minimizar el movimiento innecesario de datos, particiona ambos Marcos de Datos utilizando la(s) misma(s) columna(s) utilizada(s) en la condición de unión.
- Evita las columnas torcidas: No hagas particiones en columnas con pocos valores dominantes, ya que esto conduce a una distribución desequilibrada de la carga de trabajo entre los nodos.
- Utiliza
repartition()
obroadcast()
con prudencia: Utilizarepartition()
para conjuntos de datos grandes en los que sea posible una distribución uniforme, ybroadcast()
para tablas significativamente más pequeñas, para evitar por completo el barajado. - Supervisa el tamaño y la distribución de los datos: Comprender las características subyacentes de tus datos (por ejemplo, la cardinalidad y la distribución de frecuencias de las claves de unión) te ayuda a elegir la estrategia de partición más equilibrada.
Estrategias y casos de uso avanzados de PySpark Join
PySpark incluye mecanismos especializados para casos más exigentes, que permiten una eficacia aún mayor:
La gama se une
Las uniones por rango se utilizan cuando se emparejan filas basándose en condiciones numéricas o temporales, en lugar de en la igualdad exacta. Estas uniones son habituales en escenarios que implican series temporales de datos, como el análisis de registros, el seguimiento de eventos o los flujos de sensores IoT.
Las mejores prácticas para una unión eficaz de las gamas incluyen
- Minimizar la sobrecarga de barajado: Una partición adecuada es esencial para evitar costosos movimientos de datos. Cuando trabajes con uniones de rangos, considera la posibilidad de particionar los datos en función de ventanas temporales o rangos de valores relevantes para tu caso de uso.
- Ordenar los datos dentro de las particiones: Ordenar los datos por la clave de rango (por ejemplo, la marca de tiempo) antes de realizar la unión puede mejorar el rendimiento, especialmente cuando se utilizan operaciones como
rangeBetween
obetween
. - Evita las exploraciones de gran alcance: Mantén los rangos de unión lo más estrechos posible para reducir el número de comparaciones y mejorar el tiempo de ejecución.
- Aprovecha las funciones de agrupación o ventana: Pueden ayudar a reducir las operaciones de barajado y garantizar una mejor alineación cuando se trabaja con grandes conjuntos de datos y rangos superpuestos.
Ejemplos de casos de uso
- Alinear los datos de las campañas de marketing con las interacciones de los clientes a lo largo de las ventanas temporales.
- Fusionar datos IoT o de sensores capturados en intervalos secuenciales para la detección de anomalías o el análisis de tendencias.
El streaming se une
Unir datos de flujo presenta retos únicos debido a su naturaleza continua y a menudo impredecible. Los problemas clave son los acontecimientos que llegan tarde, los datos fuera de orden y la necesidad de gestionar el estado de forma eficaz a lo largo del tiempo.
PySpark aborda estos retos utilizando marcas de agua, que definen un umbral para el tiempo que el sistema debe esperar los datos atrasados antes de descartarlos. Al establecer una marca de agua en las columnas de tiempo de eventos, PySpark puede gestionar eficazmente los datos atrasados y optimizar el uso de recursos.
Las marcas de agua son especialmente útiles cuando se unen dos fuentes de flujo o un flujo con un conjunto de datos estático, ayudando a mantener tanto el rendimiento como la coherencia en los conductos de datos en tiempo real.
Uniones de funciones de aprendizaje automático (ML)
Las uniones desempeñan un papel crucial en la preparación de los datos para los modelos de aprendizaje automático, por ejemplo, al modelos con Spark MLlib. Consolidar estas características en un conjunto de datos único y unificado es esencial para el entrenamiento y la evaluación precisos de los modelos.
Entre las estrategias para unir rasgos de forma eficaz en los sistemas en tiempo real se incluyen:
- Utilizar uniones de difusión para tablas de características pequeñas y estáticas para minimizar la mezcla y acelerar el enriquecimiento de datos en tiempo real.
- Preagrupar funciones utilizando funciones de ventana u operaciones de grupo antes de unir, para reducir el volumen de datos en movimiento.
- Aprovechar las marcas de agua y la alineación evento-tiempo al unir flujos en tiempo real para garantizar actualizaciones de características oportunas y relevantes.
- Persistencia de uniones intermedias para características reutilizadas con frecuencia, con el fin de evitar cálculos redundantes en tareas posteriores.
Al gestionar eficazmente estas uniones, PySpark permite la ingeniería de características en tiempo real, dando soporte tanto a los sistemas de aprendizaje en línea como a los pipelines de entrenamiento por lotes actualizados.
Puedes aprender a hacer predicciones a partir de datos con Apache Spark, utilizando árboles de decisión, regresión logística, regresión lineal, ensembles y pipelines con nuestro curso Curso de Aprendizaje Automático con PySpark.
Buenas prácticas y retos comunes
Las operaciones de unión en la informática distribuida requieren una atención regular para evitar posibles problemas.
Unas operaciones de unión eficientes pueden mejorar drásticamente la velocidad general de la tubería y el uso de recursos. Estas son las prácticas clave que debes seguir:
- Filtrado previo a la unión: Elimina las filas irrelevantes y elimina las columnas no utilizadas antes de realizar las uniones. Esto reduce la cantidad de datos que se barajan en el clúster.
- Pedido de unión inteligente: Une siempre primero las tablas más pequeñas o difundibles para minimizar el tamaño de los datos intermedios y evitar cálculos innecesarios.
- Gestión de memoria y recursos: Supervisa la ejecución de tareas a través de la interfaz de usuario o los registros de Spark para detectar desviaciones o cuellos de botella. Asegúrate de que las estrategias de partición se alinean con los recursos del clúster para evitar sobrecargar los nodos individuales.
- Reparte sabiamente: Utiliza
repartition()
ocoalesce()
para ajustar el tamaño de las particiones y conseguir un procesamiento paralelo más equilibrado.
Antipatrones a evitar
Incluso pequeños errores en la lógica de las uniones pueden provocar problemas importantes de rendimiento o precisión de los datos. Aquí tienes los escollos más comunes a los que debes prestar atención:
- Condiciones de unión incorrectas o ambiguas: Unas condiciones de unión mal definidas pueden dar lugar a coincidencias incorrectas o a filas duplicadas. Comprueba siempre que tus claves de unión son precisas, únicas cuando sea necesario, y que coinciden adecuadamente en el tipo de datos.
- Uniones cruzadas involuntarias: Las uniones cruzadas multiplican cada fila de un Marco de Datos por cada fila de otro, lo que a menudo provoca explosiones masivas de datos. Utilízalos sólo cuando sea explícitamente necesario y con un claro conocimiento del tamaño de salida.
- Forzar uniones de difusión en DataFrames grandes: La difusión de tablas grandes puede saturar la memoria y ralentizar el rendimiento. Deja que PySpark decida, o sólo emite manualmente cuando el DataFrame es pequeño y cabe cómodamente en la memoria.
- Ignorar la inclinación de los datos: Si una o varias claves de unión están muy sesgadas, puede sobrecargar algunas particiones. Detecta el sesgo a tiempo y considera técnicas de salado o estrategias alternativas.
Incluso las uniones bien estructuradas pueden tener problemas de rendimiento o de ejecución.
He aquí los problemas más comunes y cómo resolverlos:
- Tiempos de ejecución lentos: A menudo causada por datos sesgados o imbalanced partitions. Comprueba si hay valores clave de unión muy repetitivos y considera la posibilidad de reparticionar o aplicar técnicas de salting para distribuir los datos de forma más uniforme.
- Fallos de unión o errores inesperados: Suele deberse a desajustes en el tipo de datos o a valores nulos en las claves de unión. Asegúrate de que ambos lados de la unión utilizan los mismos tipos de datos y aplica un tratamiento adecuado de los nulos.
- Errores de memoria insuficiente: Puede ocurrir cuando se unen conjuntos de datos grandes sin filtrar o cuando se fuerzan las uniones de difusión en tablas grandes. Filtra antes y difunde sólo los DataFrames pequeños y estáticos.
Conclusión
Las uniones de PySpark son la piedra angular del procesamiento de datos a gran escala, ya que permiten realizar análisis potentes y eficientes de conjuntos de datos masivos. Cuando se utilizan correctamente, revelan relaciones significativas que impulsan conocimientos más profundos y decisiones más inteligentes.
Aunque el ajuste del rendimiento puede presentar retos, como el manejo de la inclinación de los datos o la optimización de la partición, dominar estos aspectos es clave para construir canalizaciones de datos robustas.
Tanto si estás uniendo flujos en tiempo real como consolidando funciones para el aprendizaje automático, perfeccionar tus estrategias de unión puede mejorar significativamente la velocidad de ejecución, la eficiencia de los recursos y la precisión analítica.
Para profundizar, explora el procesamiento de big data con PySpark, y trabaja para convertirte en un experto en ingeniería de datos con nuestros Fundamentos de Big Data con PySpark con PySpark.
PySpark se une a las FAQ
¿Cuál es el tipo de unión más eficiente que se puede utilizar en PySpark?
El tipo de unión más eficaz depende de tus datos y objetivos. Las uniones internas son rápidas cuando existen datos coincidentes en ambos lados. Para manejar tablas de referencia pequeñas, las uniones de difusión suelen ser las más eficaces.
¿Cuándo debo utilizar las uniones de difusión en PySpark?
Utiliza las uniones de difusión cuando vayas a unir un Marco de Datos grande con otro mucho más pequeño (generalmente de menos de 10 MB a 100 MB, dependiendo de tu clúster). Transmitir la mesa más pequeña evita barajadas costosas.
¿Qué causa la desviación de los datos en las uniones y cómo puedo solucionarlo?
La desviación de datos se produce cuando determinadas claves de unión tienen registros desproporcionadamente grandes, lo que provoca la sobrecarga de algunas particiones. El salado, que consiste en añadir valores aleatorios para distribuir los datos de forma más uniforme, es una técnica eficaz para mitigarlo.
¿Es siempre necesario reparticionar antes de una unión?
No siempre, pero reparticionar por la clave de unión puede reducir drásticamente la mezcla y mejorar el rendimiento cuando los dos DataFrames proceden de fuentes distintas o están particionados de forma diferente.
¿Puede PySpark manejar uniones de datos en tiempo real?
Sí. La API de Streaming Estructurado de PySpark soporta uniones en tiempo real utilizando marcas de agua para manejar los datos que llegan tarde y gestionar el estado de forma eficiente.

Los mejores cursos de DataCamp
Curso
Machine Learning with PySpark
Curso
Cleaning Data with PySpark
Tutorial
Tutorial de Pyspark: Primeros pasos con Pyspark
Tutorial
Tutorial de unión de DataFrames en pandas

DataCamp Team
13 min
Tutorial
Instalación de PySpark (Todos los sistemas operativos)
Olivia Smith
8 min
Tutorial
Tutorial sobre la ejecución de scripts de Python en Power BI
Tutorial
Introducción al t-SNE

Tutorial