Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Problema
Desea cargar los datos de varios archivos planos estructurados de forma idntica, desde un nico
directorio, ms rpido de lo que poda cargar los archivos en secuencia estricta.
El siguiente archivo es Stock01.csv, se debe crear con datos otros datos, pero con la misma
estructura, Stock02.csv, Stock03.csv y Stock04.csv.
Solucin
Cargar los datos en paralelo, como sigue.
1. Crear una tabla en SQL Server para mantener los nombres de archivo con el siguiente DDL:
USE BDBlog;
GO
CREATE TABLE dbo.CargaParalelaSimple
(
ID INT IDENTITY(1,1) NOT NULL,
FileName VARCHAR (250) NULL,
ProcessNumber AS (ID%(4))
);
GO
2. Crear una tabla en SQL Server para contener los datos, una vez cargados, utilizar la siguiente
DDL:
CREATE TABLE dbo.StockParalelo
(
ID bigint IDENTITY(1,1) NOT NULL,
Make VARCHAR (50) NULL,
Marque VARCHAR(50) NULL,
Model VARCHAR (50) NULL,
Colour TINYINT NULL,
Product_Type VARCHAR (50) NULL,
Vehicle_Type VARCHAR (50) NULL,
Cost_Price NUMERIC(18, 2) NULL
);
3. Crear un nuevo proyecto SSIS (llmelo CargarVariosFlat) y renombre el paquete por defecto
aProcesoParaleloSimple. Aadir dos administradores de conexin, una OLEDB, y otra ADO.NET,
que se conectan a la base de datos que va a utilizar para cargar los datos y metadatos (BDBlog en
este ejemplo). Nmbrelos BDBlog_OLEDB y BDBlog_ADONET, respectivamente.
4. Agregue las siguientes variables a nivel de paquete, as como los valores iniciales dados:
Por supuesto, debe utilizar su propio filtro de archivos y directorio de origen si no est siguiendo este
ejemplo exactamente.
5.
Agregar un contenedor Sequence en el panel Control Flow, y nmbrelo Crear Tabla de Archivos a
Procesar.
6. Aadir una tarea Execute SQL en el contenedor Sequence, y nmbrelo Preparar Tabla. Dele
doble clic para editarlo. Ajuste los siguientes elementos:
Connection Type: OLEDB
Connection: BDBlog_OLEDB
SQLStatement: TRUNCATE TABLE dbo.CargaParalelaSimple
El cuadro de dilogo Execute SQL Task Editor debe ser similar a la figura.
16. Ahora bien, para movernos al procesamiento paralelo actual. Agregue las siguientes variables a
nivel de paquete:
17. Agregar una tarea Execute SQL bajo el contenedor Sequence, conecte el contenedor a la nueva
tarea, y renmbrelo a Preparar Tabla Destino. Dele doble clic para editarlo. Ajuste los siguientes
elementos:
Connection Type: OLEDB
Connection: BDBlog_OLEDB
SQL Statement: TRUNCATE TABLE dbo.StockParalelo
18. Haga clic en OK para confirmar.
19. Aada un nuevo administrador de conexin Flat File, nmbrelo Proceso1, y configrelo para
conectarse a cualquiera de los archivos de origen. En las propiedades de este administrador de
conexin, establezca en Expressions para su ConnectionString a @[User::FileSource] +
@[User::NombreArchivo_Lote_1].
20. Aada una tarea Execute SQL bajo la tarea "Preparar Tabla Destino", conctela a sta nueva
tarea, y renmbrela Obtener Lote 1. Dele doble clic para editarlo. Ajuste los siguientes elementos:
Connection Type: ADO.NET
Connection: BDBlog_ADONET
ResultSet: Full Result Set
SQL Statement: SELECT FileName
FROM dbo.CargaParalelaSimple
WITH (NOLOCK)
WHERE ProcessNumber = 1
21. En la pestaa Result Set, dar clic en Add, en la columna Result Name colocar 0 y en la columna
Variable Name colocar User::Lote_1
22. Haga clic en OK para confirmar.
23. Aadir un contenedor Foreach Loop bajo la tarea "Obtener Lote 1", conctela a la nueva tarea, y
renmbrelo Cargar Archivos en Lote 1. Dele doble clic para editarlo. Ajuste los siguientes
elementos:
Enumerator: Foreach ADO Enumerator
ADO Object Source Variable: User::Lote_1
Variable: User::NombreArchivo_Lote_1 (en Variable Mappings)
24. Haga clic en OK para confirmar.
25. Aadir una tarea Data Flow y llmela Lote 1, dentro del contenedor Foreach Loop, y configrelo
para conectar el administrador de conexin Flat File Proceso1 a la tabla de destino (StockParalelo)
utilizando el administrador de conexin BDBlog_OLEDB. Asegrese de que TABLOCK est
seleccionado.
26. Repita los pasos 20 a 25 tres veces (una vez para cada carga paralela adicional).
Configurar Obtener Lote 2(con ProcessNumber=2, User:Lote_2), Obtener Lote
3 (ProcessNumber=3, User:Lote_3) y Obtener Lote 4(ProcessNumber=0, User:Lote_4). Asegrese
de nombrar a los administradores de conexin Flat FileProceso2, Proceso3 y Proceso4 y
configurarlos adecuadamente. Nombre los contenedores Foreach LoopCargar Archivos en Lote
2, Cargar Archivos en Lote 3 y Cargar Archivos en Lote 4 y configurarlos adecuadamente. El
paquete final debe ser similar a la figura.
En primer lugar, el ciclo a travs de los archivos en un directorio y almacenar las rutas de
archivos en una tabla de SQL Server.
En segundo lugar, carga los archivos usando esta tabla como el origen de los nombres de
archivo, donde cada tarea carga archivos separados iterados a travs de los archivos que han sido
asignados independientemente de los otros archivos que sern cargados.
Es importante separar las dos partes, y primero atribuir los nmeros de proceso para los archivos de
origen as que cada rama del flujo del proceso slo carga su propio conjunto de archivos, como cada
proceso es separado de cualquier otro proceso. Puede pensar en l como dar "flags" a cada archivo
para decirle cul es el camino a seguir.
Se puede usar un recordset ADO.NET como parte de esta tcnica, pero prefiero introducir otro
mtodo que consiste en utilizar una tabla de base de datos persistente. Esto parece preferible porque
usando una tabla le permite almacenar la lista en el disco, y puede proporcionar una base para el
proceso de registro y de lote.
Tenemos que tener claro sobre exactamente lo que este paquete lograr. Simplemente dividir todos
los archivos de origen en lotes (en este caso utilizar cuatro, cada uno de los cuales ser un proceso
paralelo aparte) y los procesara todos. No se intentar realizar cualquier balance de carga u
ordenamiento de proceso. Por tanto, este enfoque funciona bien cuando todos los archivos con del
mismo tamao, y no se est buscando la secuenciacin ptima. Es, sin embargo, atractivo en su
simplicidad, tanto conceptual como prctica. La tcnica utilizada para definir qu archivo es atribuido
a que proceso es utilizar una columna Identity de SQL Server y, entonces, aplicar "% 4" para crear los
nmeros de 0 a 3 (el resto cuando se aplica el operador de mdulo) como una columna
ProcessNumber separada a cada archivo sucesivamente. En este ejemplo, la atribucin del hilo del
proceso es definido como una columna calculada, para evitar los pasos adicionales. La tabla de
nombres de archivos y nmeros de lote es entonces utilizada como la lista de orgenes para la carga
en paralelo. Por supuesto, no necesita utilizar cuatro procesos paralelos, puede utilizar ms o menos.
Cuntos procesos son necesarios para una carga ptima de datos podra requerir pruebas