Como crear una dimensión Date con PySpark

2 min read

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
