← Volver al método
Para quien construye

Los datos: de la FEB a Delta Lake

La federación publica los datos de cada partido, pero con identificadores que cambian, textos que se rompen y un historial incompleto. Así se convierten en algo en lo que se pueda confiar.

39flujos de ingesta y refinado
12tablas Silver
> 99 %de los eventos de una temporada, asignados a un jugador real
+ 800pruebas automáticas entre los dos repositorios

Cifras a 6 de octubre de 2026.

El mapa completo

FuenteLa FEBPáginas y servicios públicos de la federación
BronzeTal cualJSON y HTML sin convertir
SilverDelta LakeDoce tablas tipadas
GoldSiete tablas DeltaLa puerta entre dominios
FicherosJSON estáticosEmpaquetados para la web
WebNext.jsEn Vercel, de solo lectura
Dónde está el Gold
En el gobierno de datos del laboratorio, Bronze ingesta, Silver transforma y Gold empaqueta: es la superficie pública de un dominio, solo lo que de verdad se consume fuera. Hay dos Gold. El primero son siete tablas Delta que publica el repositorio de ingesta (partidos, jugador-partido, equipo-partido, plantillas, eventos, estado del partido y perfiles de tiro): es lo único que lee el agente de contenido, que es otro dominio. El segundo son los ficheros estáticos que el agente calcula para la web, que no lee Delta sino JSON. Cómo se organiza esa frontera está en Contratos de datos y dominios independientes.

1 · El problema de partida

ProblemaLos identificadores mutan

El identificador de jugador de la FEB no es estable entre equipos ni entre temporadas, y a veces ni dentro de la misma: se han visto jugadores a los que se les reemitió el id a mitad de temporada, y el anterior dejó de responder. El de equipo identifica a un club en una temporada (a veces en una competición).

ProblemaEl texto libre miente

El nombre de la competición puede llegar corrupto (por ejemplo «COPA ESPAÑA - Play Off - 1/8 Final - 2115» en vez de «COPA ESPAÑA»). Lo único fiable es el identificador numérico de competición.

ProblemaEl orden importa y no lo dicen

En la temporada actual el minuto a minuto llega en orden cronológico inverso: el primer elemento de la lista es el último evento del partido.

ProblemaEl historial está incompleto

Las actas de 2021-22 y 2022-23 no traen minutos, y en 2023-24 solo la mitad. Faltan posiciones de muchos jugadores antiguos.

2 · Bronze: aterrizar sin tocar

La regla de Bronze es una sola: aterriza, no transforma. Guarda el formato nativo de la fuente (JSON si es JSON, HTML si es HTML) sin convertirlo ni decidir qué vale la pena. Los partidos terminados no se vuelven a pedir; los que la fuente aún marca «en juego» se reintentan, para no quedarnos con una foto a medias para siempre. Y la ingesta masiva de histórico se hace con un ritmo educado de peticiones.

Flujos automáticos

Se encadenan con llamadas directas, no con crons separados:

descubrir partidos terminados en el calendario oficial → ingerir su minuto a minuto → descubrir y traer las plantillas → traer las fichas de los jugadores → recuperar a los que se marcharon o cambiaron de id a partir del propio minuto a minuto.

Flujos con semilla

Semi-manuales a propósito: hay rondas (playoffs, fase de grupos de la Copa) que el calendario normal no lista.

Una persona aporta una semilla (un identificador de partido, de serie o de grupo) y el flujo descubre el resto recorriendo los identificadores sin mirar su contenido.

Error realEl cron que recorría siete temporadas cada noche
La primera versión del flujo diario usaba «auto» como temporada y, sin que nadie lo notara, repasaba las siete temporadas completas todas las noches. Lo encontró una auditoría. Ahora usa solo la temporada actual.
Error realDos relojes, un hueco
Con Bronze al día cada noche pero Silver lanzado a mano, un partido descubierto de madrugada era invisible para cualquier consumidor hasta que alguien lanzaba seis reprocesos a la mañana siguiente. Se descubrió la noche en que arrancó la temporada 2026-27. Solución: Bronze dispara Silver como último paso de su propia cadena, con una llamada directa, en lugar de darle otro cron unos minutos después (un desfase de reloj repetiría el mismo fallo).

3 · Silver: Delta Lake y doce tablas

matchesMetadatos tipados: fecha ISO, marcador, competición y fase
teams · team_playersPlantillas: el puente equipo ↔ jugador ↔ temporada
playersIdentidad canónica de cada jugador
eventsEl minuto a minuto, convertido en eventos tipados y ordenados
game_stateEl partido evento a evento: marcador, probabilidad de victoria, quinteto en pista
player_boxscore · team_boxscoreEl acta oficial certificada por la FEB
shooting_profilesIntentos y aciertos por zona
derived_minutesMinutos y +/- de cada jugador, reconstruidos desde las sustituciones
player_positions · results_without_reportDos tablas escritas a mano y versionadas: posiciones y marcadores de partidos que la fuente no sirve

Por qué Delta Lake y no JSON plano o Parquet suelto. Tres razones, por orden de peso: (1) reutiliza la validación de contratos que el proyecto ya tenía para Delta; (2) permite evolucionar el esquema de forma explícita y auditable; (3) la sobrescritura transaccional por partición encaja con cómo se reprocesa: un dato de identidad mejora sin que Bronze cambie.

Error real5.833 particiones y un deadlock
Las tablas de partidos se particionaban por identificador de partido: unas 5.800 particiones, y una versión de la librería de Delta se bloqueaba. Se repartieron por temporada y competición (unas pocas decenas) y desapareció. Las tablas de baja cardinalidad (equipos) nunca tuvieron el problema.

Los reprocesos miran la «obsolescencia», no la existencia. Un reproceso de eventos no comprueba «¿existe ya el fichero?», sino «¿han mejorado desde entonces las plantillas y las identidades de las que depende?». La calidad de resolución de un partido mejora con el tiempo aunque su JSON en Bronze no cambie ni un byte; un reproceso que solo mirara la existencia congelaría para siempre la calidad del día en que se generó.

4 · Quién es quién

La clave de identidad es nombre completo + fecha de nacimiento: lo único que no cambia. Con ella se une al mismo jugador entre equipos y temporadas, y en los ficheros que consume la web se fija además un identificador estable. Casos reales que han dado forma a la lógica (cada uno tiene su prueba de regresión con el caso que lo motivó):

Dos hermanos

Dos hermanos con el mismo apellido compuesto en la misma plantilla no se distinguen por apellido. Se desempata con la inicial del minuto a minuto, comparada con el nombre de pila real, no con cualquier palabra del nombre: un segundo apellido que empezaba por la letra correcta ya causó una atribución cruzada entre dos jugadores de equipos distintos.

Traspasos

Un traspaso o una reemisión de id no necesita etiquetado manual. Un flujo busca nombres del minuto a minuto sin resolver, deduce el id vigente (unánime, o un corte limpio de reemisión) y trae su ficha. Una lista manual de excepciones existe como último recurso, y hoy está vacía.

Resultado: más del 99 % de los eventos de una temporada se asignan a un jugador real. El resto son huecos de cobertura documentados caso a caso, no errores de lógica.

5 · No dar por bueno lo derivado

El minuto a minuto no es una verdad: es una fuente de la que se derivan cifras. Así que se recuentan y se comparan con el acta oficial. Cada partido pasa por un punto de curación que recuenta 16 estadísticas (de equipo y de jugador) desde los eventos y las confronta con el acta certificada, con un porcentaje de acierto por campo para cada corrida.

Error realEl rebote que no distinguía
Inferir si un rebote era ofensivo o defensivo acertaba un 0,4 % de las veces contra el acta oficial. La causa: el orden inverso del minuto a minuto rompía cualquier lógica que «mirase hacia atrás». Con un único cambio (invertir la lista una vez, en Silver) el acierto pasó a más del 98 %.
Error real«TIROS LIBRES» dentro de una falta
El texto de una falta contiene la subcadena «TIROS LIBRES» (cuántos concede), y sin cuidado se clasificaba como tiro libre fallado. Afectó a 11.785 eventos de una temporada antes de corregirse.

6 · Minutos que el acta no trae

Las actas de 2021-22 a 2023-24 no traen minutos fiables, pero el minuto a minuto tiene todos los cambios. Se derivan, no se imputan estadísticamente: es una suma exacta de tramos. Se calculan en el propio repositorio de ingesta, en una tabla Silver, y llegan a Gold marcados como derivados.

para cada partido:
    para cada jugador:
        minutos = suma de los tramos en que estuvo en pista
                  (de cada "entra" al siguiente "sale", o al final del cuarto)
        marca el dato como derivado; nunca pisa un minuto que el acta sí traiga

Validación: contra las actas que sí traen minutos (2024-25: 656 jugadores de 30 partidos; 2023-24: 254), el error mediano es de 0 segundos, el percentil 90 está en unos 20 y el peor caso es de 49. Y los diez jugadores en pista suman siempre exactamente diez veces la duración del partido.

El +/- tiene una comprobación exacta
En cada equipo, la suma del +/- de sus jugadores debe ser 5 veces la diferencia final de puntos (cada canasta cuenta para los cinco que están en pista). El +/- derivado de los cambios la cumple siempre; el del acta, en las temporadas antiguas, casi nunca. Por eso solo se sustituye el del acta cuando no cumple la identidad, y cuando sí la cumple (2024-25 en adelante) se respeta.

7 · Después de Silver

Desde Silver, los agregados que necesita la web (clasificaciones, perfiles de jugador, quintetos ideales, familias de jugadores…) se calculan con una herramienta de terminal y se escriben como ficheros estáticos: el segundo de los dos Gold, el de la web. Cómo se hace, y cómo se convierten además en tarjetas y vídeos, está en el siguiente artículo.

Siguiente: El contenido: de las tablas a la tarjeta y al vídeo →
Lo que todavía no está resuelto.Las posiciones de los jugadores antiguos (en curso) y las zonas de tiro de dos puntos, que solo existen desde 2024-25.
Fuentes. Actas oficiales y minuto a minuto de la FEB. Datos actualizados por última vez el 4 de octubre de 2026 (último partido incluido).
Contacto. ¿Algo no cuadra, falta algo o hay una idea? Los avisos son bienvenidos por cualquiera de estos canales.
Molokai Lab es un proyecto independiente y no está afiliado a la Federación Española de Baloncesto.