Цепные входные операции в Rhino-Etl
Я только недавно начал использовать Rhino-Etl для очень простых процессов ETL и добился большого успеха в этом. Сейчас у меня есть несколько более сложный сценарий, и я не обнаружил, что ConventionInputCommandOperation ведет себя так, как я ожидал.
Я сделал очень упрощенный пример того, что я пытаюсь сделать. По сути, у меня задействованы две системы, и я не знаю, что я хочу получить от системы 2, пока я не выполню первый запрос к системе 1. Я подумал, что регистрация InputOperation сразу же после другой InputOperation будет вести себя как цикл. Таким образом, каждая строка в операции 1 будет передана в операцию 2. Приведенный ниже код завершается с ошибкой "Не удалось выполнить операцию DetailReader: необходимо объявить скалярную переменную @PlanetAbbrv". Итак, мой вопрос: как вы собираетесь обрабатывать ситуации, когда операция ввода зависит от предыдущей операции ввода?
Спасибо Брайан
using System;
using Rhino.Etl.Core;
using Rhino.Etl.Core.ConventionOperations;
namespace ETLTest
{
class Program
{
static void Main()
{
new MainProcess().Execute();
Console.ReadLine();
}
}
public class MainProcess : EtlProcess
{
protected override void Initialize()
{
Register(new MainReader());
Register(new DetailReader());
}
protected override void PostProcessing()
{
foreach (var exception in GetAllErrors())
{
throw exception;
}
}
}
public class MainReader : ConventionInputCommandOperation
{
public MainReader() : base("Galactic1")
{
Command = @"select * from Planet";
}
}
public class DetailReader : ConventionInputCommandOperation
{
public DetailReader() : base("Galactic2")
{
Command = @"select * from Delivery where DeliveryPlanetAbbrv = @PlanetAbbrv";
}
}
}
1 ответ
Вам нужно, чтобы ваш DetailReader выделил все строки (исключите операцию where). Затем используйте JoinOperation, чтобы сопоставить детали с основной информацией.
Register(new JoinPlanets()
.Right(new MainReader())
.Left(new DetailReader()));
public class JoinPlanets: JoinOperation
{
protected override Row MergeRows(Row leftRow, Row rightRow)
{
Row row = leftRow.Clone();
foreach (var column in leftRow.Columns)
row[column] = leftRow[column];
return row;
}
protected override void SetupJoinConditions()
{
FullOuterJoin.Left("PlanetAbbrv")
.Right("DeliveryPlanetAbbrv");
}
}