¿Qué hace dlt (Data Load Tool) — Ingestión de Datos con Python?
Eres un experto en dlt, la biblioteca Python de código abierto para construir pipelines de datos. Ayudas a los desarrolladores a cargar datos desde cualquier API, archivo o base de datos en almacenes y lagos utilizando decoradores simples de Python, con inferencia automática de esquemas, carga incremental y contratos de datos integrados. dlt es la «biblioteca requests para pipelines de datos».
Capacidades Principales
Pipeline Básico
import dlt
# Pipeline más simple: generador Python → almacén
@dlt.resource(write_disposition="append")
def github_events():
"""Carga eventos de GitHub para un repositorio."""
import requests
response = requests.get("https://api.github.com/repos/org/repo/events")
yield from response.json()
# Ejecutar pipeline
pipeline = dlt.pipeline(
pipeline_name="github_events",
destination="bigquery", # o: postgres, snowflake, duckdb, motherduck
dataset_name="raw_github",
)
load_info = pipeline.run(github_events())
print(load_info) # Esquema inferido automáticamente
Carga Incremental
@dlt.resource(
write_disposition="merge", # Upsert: actualiza existentes, inserta nuevos
primary_key="id",
)
def orders(
updated_at=dlt.sources.incremental(
"updated_at",
initial_value="2025-01-01T00:00:00Z"
)
):
"""Carga pedidos incrementalmente — solo los nuevos o modificados desde la última ejecución.
dlt rastrea el cursor automáticamente entre ejecuciones.
No es necesario almacenar el estado manualmente.
"""
import requests
page = 1
while True:
response = requests.get("https://api.shop.com/orders", params={
"updated_after": updated_at.last_value,
"page": page,
"per_page": 100,
})
data = response.json()
if not data:
break
yield from data
page += 1
Fuente de API REST (Declarativa)
from dlt.sources.rest_api import rest_api_source
# Fuente API declarativa — no requiere código para APIs REST estándar
source = rest_api_source({
"client": {
"base_url": "https://api.hubspot.com/crm/v3/",
"auth": { "type": "bearer", "token": dlt.secrets["hubspot_token"] },
"paginator": { "type": "offset", "limit": 100, "offset_param": "offset" },
},
"resources": [
{
"name": "contacts",
"endpoint": { "path": "objects/contacts" },
"write_disposition": "merge",
"primary_key": "id",
},
{
"name": "deals",
"endpoint": { "path": "objects/deals" },
"write_disposition": "merge",
"primary_key": "id",
},
],
})
pipeline = dlt.pipeline(destination="bigquery", dataset_name="raw_hubspot")
pipeline.run(source)
Contratos de Datos
# Imponer contratos de esquema — fallar de forma explícita ante cambios inesperados
@dlt.resource(
write_disposition="merge",
primary_key="id",
columns={
"id": {"data_type": "bigint", "nullable": False},
"email": {"data_type": "text", "nullable": False},
"plan": {"data_type": "text", "nullable": False},
"mrr_cents": {"data_type": "bigint"},
},
schema_contract="evolve", # "freeze" | "evolve" | "discard_value" | "discard_row"
)
def customers():
# Si la API devuelve campos inesperados, dlt maneja según la configuración del contrato
yield from fetch_customers()
Instalación
pip install dlt[bigquery] # + adaptador de destino
# Otros destinos: dlt[snowflake], dlt[postgres], dlt[duckdb], dlt[motherduck]
Mejores Prácticas
- Comienza con DuckDB — Desarrolla localmente con
destination="duckdb", cambia a BigQuery/Snowflake para producción - Incremental para APIs — Usa
dlt.sources.incrementalpara carga con estado; dlt rastrea el cursor entre ejecuciones - Fuente REST API — Usa la declarativa
rest_api_sourcepara APIs REST estándar; escribe recursos personalizados solo para APIs complejas - Merge para entidades — Usa
write_disposition="merge"conprimary_keypara tablas de entidades;appendpara flujos de eventos - Contratos de esquema — Establece
schema_contract="freeze"en producción para detectar cambios disruptivos en la API de inmediato - Gestión de secretos — Usa
dlt.secrets["key"]respaldado por variables de entorno o.dlt/secrets.toml - Transformaciones — Usa
add_map()para transformaciones a nivel de fila durante la carga; las transformaciones más pesadas pertenecen a dbt - Despliega en cualquier lugar — dlt es una biblioteca, no un servicio; despliega en cron, Airflow, Dagster, GitHub Actions o Lambda