Как вы сопоставляете входные данные с выходными столбцами в преобразовании MergeJoin с EzAPI? - PullRequest
1 голос
/ 01 февраля 2012

Я нахожусь в процессе программного построения довольно сложного потока данных SSIS с использованием библиотеки EzAPI и столкнулся с проблемой.Я приложил изображение того, чего я пытаюсь достичь.

enter image description here

У меня запуск (вплоть до объединения слиянием) работает правильно, но я потерпел неудачу при попытке сопоставить вход компонента объединения слиянием с выходом.

Вот код, который у меня есть (очевидно, просто фрагмент)

            int sortPosition;

            var df = new EzDataFlow(p);

            var cur = new EzOleDbSource(df);
            cur.Connection = dstConn;
            cur.Table = "Table1";

            var hst = new EzOleDbSource(df);
            hst.Connection = hstConn;
            hst.Table = "Table2";

            // Add all the columns to the sort transformation for the Current database table
            var sortCurr = new EzSortTransform(df);
            sortCurr.AttachTo(cur);

            sortPosition = 1;
            foreach (Column c in table.Columns)
            {
                sortCurr.SortOrder[c.ColumnName] = sortPosition++;
            }


            // Same for history
            var sortHst = new EzSortTransform(df);
            sortHst.AttachTo(hst);

            sortPosition = 1;
            foreach (Column c in table.Columns)
            {
                sortHst.SortOrder[c.ColumnName] = sortPosition++;
            }

            var mrg = new EzMergeJoin(df);

            mrg.AttachTo(sortCurr, 0, 0);
            mrg.AttachTo(sortHst, 0, 1);

            mrg.JoinType = MergeJoinType.Full;

            ... now what?

Я искал высоко или низко пример или документацию для преобразования EzMergeJoin, но безрезультатно.Кто-нибудь может указать мне правильное направление?

Ответы [ 4 ]

1 голос
/ 30 января 2013

К сожалению, мы не нашли способ решить проблему с ключами соединения, не передаваемыми через поток данных. Единственный ответ, который мы придумали, - дважды выбрать ключи соединения с разными именами в вышестоящих компонентах. Затем вы сортируете только дубликаты, и это позволяет объединению слиянием использовать дубликаты в качестве ключей объединения. Исходные столбцы затем переходят к следующему компоненту в потоке данных.

Вот наш пример кода, ничего особенного, если входные столбцы настроены правильно:

            MergeJoin = new EzMergeJoin(TransformTranFact);
            MergeJoin.Name = "Merge Join";
            MergeJoin.AttachTo(SourceChecksum, 0, 0);
            MergeJoin.AttachTo(FactTranFact, 0, 1);
            MergeJoin.LinkAllInputsToOutputs();
            MergeJoin.JoinType = MergeJoinType.Full;
            MergeJoin.NumKeyColumns = mchs.Count();

mchs - это объект XElement, который содержит информацию из проекта хранилища данных, захваченного в Dimodelo Architect. Мы используем EzAPI для автоматизации создания сложных ETL для хранилища данных непосредственно из проекта хранилища данных, записанного в Dimodelo Architect .

0 голосов
/ 16 июня 2016

Мне удалось решить эту проблему, сделав небольшую модификацию метода LinkInputToOutput в EzComponent.Вот до / после:

До:

if (InputColumnExists(inputIndex, colName))
    return; // return as this column is already linked
IDTSInput100 input = m_meta.InputCollection[inputIndex];
IDTSVirtualInput100 virtualInput = input.GetVirtualInput();
IDTSVirtualInputColumn100 virtualInputColumn = virtualInput.VirtualInputColumnCollection[colName];
m_comp.SetUsageType(input.ID, virtualInput, virtualInputColumn.LineageID, DTSUsageType.UT_READONLY);

После:

IDTSInput100 input = m_meta.InputCollection[inputIndex];
IDTSVirtualInput100 virtualInput = input.GetVirtualInput();
IDTSVirtualInputColumn100 virtualInputColumn = virtualInput.VirtualInputColumnCollection[colName];
if (InputColumnExists(inputIndex, colName))
    m_comp.SetUsageType(input.ID, virtualInput, virtualInputColumn.LineageID, DTSUsageType.UT_IGNORED);

m_comp.SetUsageType(input.ID, virtualInput, virtualInputColumn.LineageID, DTSUsageType.UT_READONLY);

Вам все еще нужно вручную связать столбцы, которые существуют в обоихисходные компоненты, такие как:

mergeJoin.LinkInputToOutput(0, "KeyField");
0 голосов
/ 02 августа 2012

На данный момент я нашел неоптимальное, но прагматичное решение. Если в одном из ваших запросов вы дважды выберете столбец ключа объединения, но для одного из них будет установлена ​​опция сортировки, он будет ссылаться на выходные данные объединения слиянием.

0 голосов
/ 01 февраля 2012

В качестве начального ответа попробуйте добавить

        // Not sure how to handle multiple key columns
        mrg.NumKeyColumns = 1;
        mrg.LinkAllInputsToOutputs();

Мой поток данных был настроен как Current ветвь выглядит как

  • source_id (отсортировано)
  • col1

Historical ветвь выглядит как

  • source_id (отсортировано)
  • col2

Я только отсортировал по начальному столбцутак как я хотел видеть вывод наподобие source_id, col1, col2.

enter image description here

Я все еще смотрю код, чтобы увидеть, как добавить ключ соединения, но естьпока не нашел.

...