¿Qué es la deduplicación de datos y por qué es tan importante?

En el universo de los datos, la presencia de duplicados es casi una garantía. Desde registros de clientes que se repiten hasta transacciones que aparecen más de una vez, los datos duplicados son un problema silencioso que puede socavar la fiabilidad de tus análisis, inflar tus costos y ralentizar tus operaciones. Aquí es donde entra en juego la deduplicación de datos, una práctica esencial en la gestión de cualquier conjunto de datos.
¿Qué es exactamente la deduplicación de datos?
En términos sencillos, la deduplicación de datos es el proceso de identificar y eliminar registros duplicados de un conjunto de datos. El objetivo principal es asegurar la unicidad y la precisión de la información, manteniendo solo una versión "verdadera" o "maestra" de cada entidad o evento.
Piensa en una tabla de clientes: si tienes a "Cliente1" con su información dos veces, la deduplicación se encargaría de dejar solo una versión del cliente, que será la más reciente o no dependiendo el método de deduplicación que utilicemos.
¿Por qué es tan importante la deduplicación de datos?
La importancia de la deduplicación de datos tiene un impacto directo en la calidad de los datos, la eficiencia operativa y la toma de decisiones.
1. Mejora la calidad y fiabilidad de los datos
Los datos duplicados sesgan los resultados. Si un cliente aparece cinco veces, tus informes de ventas o marketing lo contarán cinco veces, dándote una visión inflada y errónea. La deduplicación asegura que tus análisis reflejen la realidad.
Basar decisiones estratégicas en datos imprecisos puede llevar a resultados desastrosos. Con datos deduplicados, los insights que obtengas serán más fiables, permitiéndote tomar decisiones informadas y con mayor confianza.
2. Optimiza el rendimiento y reduce costos
Menor consumo de almacenamiento: Los datos duplicados ocupan espacio valioso. Eliminar las copias innecesarias reduce los requisitos de almacenamiento, lo que se traduce directamente en ahorros de costos.
Procesamiento de Datos más Rápido: Procesar menos datos significa que tus pipelines de ETL, tus consultas de bases de datos y tus modelos de machine learning se ejecutarán de forma más eficiente y rápida, ahorrando tiempo y recursos computacionales.
3. Facilita la Gobernanza de Datos
- Coherencia de Datos: La deduplicación ayuda a mantener la coherencia en todo tu ecosistema de datos, asegurando que todos los sistemas utilicen la misma versión de la verdad.
¿Cómo se realiza la deduplicación de datos?
A continuación veremos como realizar la deduplicación de datos con PySpark en Microsoft Fabric. Utilizaremos unos datos de ejemplo sobre productos.
# Datos de ejemplo con duplicados
data = [
(1, "Producto1", 9.99, datetime.strptime("2025-01-01 00:00:00", "%Y-%m-%d %H:%M:%S")),
(2, "Producto2", 25.00, datetime.strptime("2025-02-10 11:30:00", "%Y-%m-%d %H:%M:%S")),
(1, "Producto1", 9.99, datetime.strptime("2025-01-01 00:00:00", "%Y-%m-%d %H:%M:%S")), # Duplicado exacto
(3, "Producto3", 42.35, datetime.strptime("2025-05-01 14:00:00", "%Y-%m-%d %H:%M:%S")),
(2, "Producto2", 25.00, datetime.strptime("2025-03-01 15:32:58", "%Y-%m-%d %H:%M:%S")), # Duplicado de Producto2, con fecha posterior
(4, "Producto4", 59.99, datetime.strptime("2025-05-27 16:00:00", "%Y-%m-%d %H:%M:%S")),
(1, "Producto1", 12.99, datetime.strptime("2025-03-21 09:00:00", "%Y-%m-%d %H:%M:%S")), # Duplicado de Producto1, con fecha más reciente
(5, "Producto2", 25.00, datetime.strptime("2025-03-01 15:32:58", "%Y-%m-%d %H:%M:%S")) # Duplicado exacto de Producto2 (ID diferente pero mismos datos clave)
]
schema = StructType([
StructField('id', IntegerType(), True),
StructField('product_name', StringType(), True),
StructField('price', DoubleType(), True),
StructField('last_updated', TimestampType(), True)
])
df = spark.createDataFrame(data, schema=schema)
print("DataFrame Original:")
df.show()
print(f"Número de registros original: {df.count()}")
Existen varias maneras de abordar la deduplicación. Las más comunes son:
Deduplicación exacta
Filas que son completamente idénticas en todas sus columnas, o en un subconjunto específico de columnas que actúan como "clave". En pyspark se suelen utilizar estas dos funciones:
dropDuplicates(): La forma más sencilla de eliminar filas completamente idénticas o basándose en un conjunto específico de columnas.distinct(): Similar adropDuplicates()sin argumentos, elimina filas idénticas.
# Deduplicación basada en todas las columnas
df_deduplicated_all = df.dropDuplicates()
print("DataFrame Deduplicado (Todas las columnas):")
df_deduplicated_all.show()
print(f"Número de registros deduplicados (todas las columnas): {df_deduplicated_all.count()}")

Como se puede ver, realizando la deduplicación de datos sobre todas las columnas solo elimina aquellos duplicados idénticos, que en este caso es el id 1 con precio 9.99.
Veamos que ocurre si utilizamos la misma función pero especificando la clave primaria.
df_deduplicated_subset = df.dropDuplicates(subset=["id"])
print("\nDataFrame Deduplicado (Basado en id):")
df_deduplicated_subset.show()
print(f"Número de registros deduplicados (id): {df_deduplicated_subset.count()}")

En esta ocasión podemos ver como no hay ids duplicados, pero, ¿la información que tenemos es precisa? spoiler: no.
Si nos fijamos en los datos del id = 1, tenemos tres registros. Con la operación de deduplicación anterior basada en la columna id, hemos eliminado los duplicados pero quedándonos con el primer valor, lo que nos hace tener información no válida para nuestros análisis (aquí no tenemos en cuenta las dimensiones lentamente cambiantes tipo 2).

En el caso que necesitemos eliminar los duplicados pero obteniendo el registro con los datos más actualizados, deberemos de utilizar otra forma de deduplicación.
Deduplicación por Prioridad/Versión:
Es la forma de deduplicación más robusta y la que se suele utilizar en los proyectos.
¿Qué busca? Varias versiones del mismo registro de entidad, donde no todas las columnas son idénticas, pero se refieren a la misma "cosa" (por ejemplo, el mismo producto con información ligeramente diferente o con distintas fechas de actualización). Se aplica una lógica de negocio para elegir la "mejor" versión.
Uso de funciones de ventana (Window functions) junto con row_number(), rank(), dense_rank() para seleccionar un registro preferido (ej. el más reciente).
Ejemplo de uso con PySpark
Para definir la ventana utilizaremos Window particionando por la clave primaria (columna id) y ordenamos de manera descendente por la columna last_updated para obtener el registro más actualizado primero.
Asignamos un número de fila para cada registro dentro de su partición por clave primaria.
from pyspark.sql.functions import col, row_number, to_timestamp
from pyspark.sql.window import Window
window_spec_pk = Window.partitionBy("id").orderBy(col("last_updated").desc())
df_ranked_pk = df.withColumn("row_num", row_number().over(window_spec_pk))
print("\nDataFrame con número de fila (para priorización por id):")
df_ranked_pk.show()
El resultado que obtenemos es que para el producto 1 y 2 tenemos varías versiones, quedando la más reciente con el row_num a 1.

Si filtramos para mantener solo los registros más recientes (row_num = 1), obtenemos los datos deduplicados.
df_deduplicated_pk_priority = df_ranked_pk.filter(col("row_num") == 1).drop("row_num")
print("\nDataFrame Deduplicado por Clave Primaria (id) - Prioridad (más reciente):")
df_deduplicated_pk_priority.show()
print(f"Número de registros deduplicados por PK (prioridad): {df_deduplicated_pk_priority.count()}")

Ejemplo de uso con SparkSQL
df.createOrReplaceTempView("productos")
df = spark.sql("""
WITH dedupes AS
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY id ORDER BY last_updated DESC) AS row_num
FROM productos
)
SELECT *
FROM dedupes
""")
df.show()

df = spark.sql("""
WITH dedupes AS
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY id ORDER BY last_updated DESC) AS row_num
FROM productos
)
SELECT
id,
product_name,
price,
last_updated
FROM dedupes
WHERE row_num = 1
""")
df.show()

Conclusión
La deduplicación es una práctica esencial en el procesamiento de datos, y PySpark en Microsoft Fabric ofrece las herramientas robustas para realizarla de manera eficiente. Este proceso mejora la calidad de los datos, optimiza el rendimiento de las consultas y análisis, y reduce los costos de almacenamiento.




