IBM DataStage: оценивать строку как код / ​​выражение

У меня есть сложное преобразование, где стадия поиска определяет одну из приблизительно 30 различных / определенных строковых операций, которые должны быть выполнены в строке. Мне интересно, как это сделать эффективно в DataStage?

Требование примерно так:

    If 
      col_a = 1 
    Then 
      col_b := some_string_function(col_c) 
    Else If 
      col_a = 2 
    Then 
      col_b := some_other_string_function(col_d) 
    Else If 
      col_a = 3 
    Then 
      col_b := yet_another_string_function(col_c & col_d) 
    Else If ...

... и так далее.

Что я исследовал до сих пор:

Моим первым импульсом было включить код (имена полей и строковые функции) в качестве строки / поля в таблицу поиска и использовать этот код после поиска в выражении этапа преобразователя. Однако, кажется, нет никакого способа оценить строку как код внутри выражения преобразователя?

Другое решение, которое я придумала, состоит в том, чтобы поместить код во множество вложенных управляющих операторов внутри стадии преобразования, что кажется ужасно неэффективным, особенно если учесть, что DataStage не предлагает управляющий оператор, эквивалентный чему-то вроде "CASE"/"SWITCH". ". Или это?

Подстановка (часть) управляющих операторов с переключающей ступенью, подающей разные ступени поиска / трансфомера, может показаться более эффективной, поскольку их можно выполнять параллельно, но это будет проблематично для разработки.

Я еще не баловался с подпрограммами сервера.

1 ответ

Я знаком с Datastage 8.5. Наличие длинного оператора If/Then/Else в преобразовании будет работать, но да, это грязно и неэффективно.

Моя первая мысль - использовать подпрограмму Server типа Transform function.

Функция может работать так:

Transform function    
Arguments: col_A, col_C, col_D

    FUNCTION CALC_B(col_A,col_C,col_D)
    Begin Case
      Case colA = 1
           Ans = StringFunc(colC)

      Case colA = 2
           Ans = OtherStringFunc(colC,colD)

      Case colA = 3 OR colA = 4
            Ans = YetOtherStringFunc(colC,colD)
    End Case

Затем в своем преобразовании вы можете использовать функцию для установки значения col_B.

CALC_B(myrow.colA,myrow.colC,myrow.colD)

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

IBM - Работа с рутиной

IBM - базовый язык программирования

DataStage BASIC имеет миллиард строковых функций. Хорошо, может быть, всего 440 или около того. Его конструкция CASE компилируется в эквивалентную структуру If..Then..Else. Фактически, оба они компилируются в серию инструкций TEST..JUMP на самом низком уровне.

Другие вопросы по тегам