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