Cómo almacenar datos históricos de manera mucho más eficiente

Almacenamiento eficiente de datos históricos

Un tutorial práctico usando PySpark para almacenar solo el 0.01% de las filas de un DataFrame sin perder ninguna información.

Foto de Supratik Deshmukh en Unsplash

En una era donde las empresas y organizaciones están recopilando más datos que nunca antes, los conjuntos de datos tienden a acumular millones de filas innecesarias que no contienen nueva ni valiosa información. En este artículo, nos centraremos en un aspecto crítico de la gestión de datos: eliminar filas en un conjunto de datos si no aportan ningún valor añadido, utilizando PySpark*.

*PySpark se utiliza en lugar de pandas cuando se trabaja con conjuntos de datos muy grandes porque puede procesar datos en múltiples computadoras, lo que lo hace más rápido y escalable. pandas funciona bien para conjuntos de datos más pequeños que pueden caber en la memoria de una sola máquina, pero puede volverse lento o incluso impracticable para big data.

Imaginemos la siguiente situación: trabajas como ingeniero/científico de datos en el departamento de mantenimiento de una empresa de bienes raíces. Durante los últimos diez años, tu empresa ha realizado una carga completa de todos los datos de mantenimiento de una base de datos externa que contiene las condiciones de tus edificios y los ha almacenado en el almacenamiento en la nube de la empresa. Los datos podrían ser así:

Este conjunto de datos tiene tres columnas:

  • id -> para el ID del edificio.
  • condition -> un número entero entre 1 (terrible) y 10 (excelente) que representa la condición del edificio.
  • import_date -> una columna de fecha y hora que representa el día en que se importó esta fila desde el software externo.

Para crear este conjunto de datos, por favor ejecuta el siguiente código:

from pyspark.sql import SparkSession, Rowfrom pyspark.sql.functions as ffrom pyspark.sql.types import IntegerType, DateTypeimport random# establecer la semilla para obtener los mismos resultados al volver a ejecutarrandom.seed(42)# crear una sesión de Sparkspark = SparkSession.builder.getOrCreate()# crear una lista de IDids = list(range(1, 11))  # Ajusta el tamaño de esta lista para obtener el número deseado de IDs únicos# crear dos posibles condiciones para cada IDconditions = [[random.randint(1, 10) for _ in range(2)] for _ in ids]# crear una lista de tuplas donde cada tupla es una filarows = [(id, random.choice(conditions[id-1]), date)         for id in ids…