(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa
Azure Data Factory
Azure Data Factory 1 min

Parametrización avanzada en ADF: pipelines genéricos y reutilizables

João Barros 04 de July de 2025 1 min de lectura

El error más común en Azure Data Factory es crear un pipeline separado por tabla. La parametrización permite crear pipelines genéricos que reciben configuración en runtime, reduciendo drásticamente el número de artefactos a mantener.

Tipos de parámetros en ADF

Pipeline Parameters:  definidos en el pipeline, pasados en runtime
Dataset Parameters:   hacen los datasets dinámicos (schema, table, path)
Linked Service Params: credenciales dinámicas por entorno
Global Parameters:    constantes compartidas por todos los pipelines
Variables:            estado interno durante la ejecución del pipeline

Dataset parametrizado

// Dataset: DS_SQL_Generic
Parameters:
  p_schema: string = "dbo"
  p_table:  string

Properties → Table:
  Schema: @{dataset().p_schema}
  Table:  @{dataset().p_table}

// Usar en el Copy Activity:
Source Dataset: DS_SQL_Generic
  p_schema: "ventas"
  p_table:  @{pipeline().parameters.source_table}

Pipeline metadata-driven

-- Tabla de configuración
CREATE TABLE adf_config.ingest_tables (
    id              INT IDENTITY PRIMARY KEY,
    source_schema   VARCHAR(50),
    source_table    VARCHAR(200),
    sink_path       VARCHAR(500),
    watermark_col   VARCHAR(100),
    is_active       BIT DEFAULT 1
);

-- ADF Pipeline:
1. Lookup → SELECT * FROM adf_config.ingest_tables WHERE is_active = 1
2. ForEach → items: @{activity('LookupConfig').output.value}
3.   Execute Pipeline: PL_Copy_Generic
       p_source_schema: @{item().source_schema}
       p_source_table:  @{item().source_table}
       p_sink_path:     @{item().sink_path}
       p_wm_column:     @{item().watermark_col}

Expresiones dinámicas útiles

// Fecha de hoy para particionamiento
@{formatDateTime(pipeline().TriggerTime, 'yyyy/MM/dd')}

// Nombre dinámico de archivo
@{concat(pipeline().parameters.table_name, '_', formatDateTime(utcNow(),'yyyyMMdd_HHmmss'), '.parquet')}

// Condición de filtro incremental
@{concat('updated_at > ', string(activity('LookupWatermark').output.firstRow.last_wm))}

Conclusión

Un pipeline metadata-driven con 1 pipeline + 1 dataset + 1 tabla de configuración sustituye 50 pipelines individuales. Es la diferencia entre un ADF de 300 artefactos imposible de mantener y uno de 20 elegantes.

Compartir: