Como crear una dimensión Date con PySpark

Una tabla de dimensión Fecha es crucial para nuestros proyectos e informes analíticos. Es una tabla que no contiene mucha lógica y se puede crear en cualquier parte del proceso ETL. Con un sencillo script con PySpark y Spark SQL puedes crearla en tu Lakehouse.

Script

Primero asignamos nuestro intervalo de fechas para crear un array y una vista temporal con todas las fechas.

from pyspark.sql.functions import explode, sequence, to_date

fechaInicio = '2000-01-01'
fechaFin = '2024-12-31'

spark.sql(f"select explode(sequence(to_date('{fechaInicio}'), to_date('{fechaFin}'), interval 1 day)) as fecha") \
    .createOrReplaceTempView('vwfecha')

La vista temporal tiene una columna con un fila por cada fecha dentro del intervalo especificado

Ahora usaremos Spark SQL para generar la dimensión Fecha y crear la tabla delta en el Lakehouse

df = spark.sql("""
select
  year(fecha) * 10000 + month(fecha) * 100 + day(fecha) AS idFecha,
  fecha,
  year(fecha) AS Anio,
  quarter(fecha) AS Trimestre,
  date_format(fecha, 'QQQ') AS TrimestreDesc,
  month(fecha) AS Mes,
  date_format(fecha, 'MMMM') AS MesDesc,
  CASE 
    WHEN month(fecha) = 1 THEN 'Enero'
    WHEN month(fecha) = 2 THEN 'Febrero'
    WHEN month(fecha) = 3 THEN 'Marzo'
    WHEN month(fecha) = 4 THEN 'Abril'
    WHEN month(fecha) = 5 THEN 'Mayo'
    WHEN month(fecha) = 6 THEN 'Junio'
    WHEN month(fecha) = 7 THEN 'Julio'
    WHEN month(fecha) = 8 THEN 'Agosto'
    WHEN month(fecha) = 9 THEN 'Septiembre'
    WHEN month(fecha) = 10 THEN 'Octubre'
    WHEN month(fecha) = 11 THEN 'Noviembre'
    WHEN month(fecha) = 12 THEN 'Diciembre'
  END AS MesDesc_ESP,
  day(fecha) AS dia,
  date_format(fecha, 'EEEE') AS DiaDesc,
  CASE
    WHEN dayofweek(fecha) = 1 THEN 'Domingo'
    WHEN dayofweek(fecha) = 2 THEN 'Lunes'
    WHEN dayofweek(fecha) = 3 THEN 'Martes'
    WHEN dayofweek(fecha) = 4 THEN 'Miércoles'
    WHEN dayofweek(fecha) = 5 THEN 'Jueves'
    WHEN dayofweek(fecha) = 6 THEN 'Viernes'
    WHEN dayofweek(fecha) = 7 THEN 'Sábado'
  END AS DiaDesc_ESP,   
  dayofyear(fecha) AS DiaDelAnio,
  weekofyear(fecha) AS Semana,
  date_format(fecha, 'yyyy-MM') AS Periodo
from
  vwfecha

""")

df.write.mode('overwrite').format("delta").saveAsTable("dimFecha")

Siéntete libre de modificar el script a tus necesidades.

0
Subscribe to my newsletter

Read articles from Kilian Baccaro Salinas directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Kilian Baccaro Salinas
Kilian Baccaro Salinas