Универсальный Солдат: Groovy Transformer В Datastage

ETL-возможности инструмента IBM DataStage охватывают достаточно широкий спектр требований, возникающих в задачах интеграции данных, но рано или поздно возникает потребность в расширении функциональности за счет реализации Parallel Routines на языке C или создания Java-классов, которые в дальнейшем используются.

в Java Transformer или Java Client. Достаточно ограниченные возможности встроенного языка Basic уже давно устарели и не могут расцениваться как серьезное подспорье (например, невозможно использовать XML-структуры или, другой пример, попробовать написать MD5-хеширование с помощью Basic. Это возможно).

, но разработка и отладка займут значительное время).

Как бы то ни было, хотелось бы иметь достаточно гибкий инструмент, позволяющий работать с потоком данных, не требующий перекомпиляции исходных кодов и который можно было бы использовать в редакторе DataStage Client. Моего коллегу и близкого друга попросили разработать Groovy Transformer. Именно об этом и пойдет речь в этой статье.

Почему Грови? Потому что этот язык достаточно гибкий и обладает всеми возможностями Java, поскольку является надстройкой над этим языком, но помимо этого предлагает разработчикам следующие преимущества:

  • Собственный синтаксис для хешей (ассоциативных массивов) и списков, поэтому вместо следующего кода Java
      
      
      
      
      
      
      
      
       

    import java.util.* ; … HashMap<String,String> someMap=new HashMap<String,String>() ; someMap.put("Key1", "Value") ; … String valFromMap=someMap.get("Key1") ;

    Вы можете использовать следующий код Groovy (java.util.* уже импортирован по умолчанию):

    HashMap someMap=new HashMap(); someMap.Key1= "Value" ; … valFromMap=someMap.Key1;

  • Строковая интерпретация (почему все называют это интерполяцией?):

    def NumberOfItems= 10; println "Number of items=$NumberOfItems";

  • Динамическое выполнение кода: вы можете выполнять код, хранящийся в строковой переменной, в потоке или в файлах, без компиляции:

    def GroovyCode='sum=a+b; println "Sum is $sum"'; Binding binding=new Binding(); binding.setVariable("a", 10); binding.setVariable("b", 20); GroovyShell shell = new GroovyShell(binding); shell.evaluate(GroovyCode);

  • Встроенная поддержка XML и JSON:

    def writer=new StringWriter() ; def xmlOut=new groovy.xml.MarkupBuilder(writer) ; xmlOut.JobsInfo{ Job(name : 'ODS_MOUVEMENT_C') { precedants { precedant "ODS_ECRITURE_C" precedant "ODS_TEC_DEB" } } } println writer;

    В этом примере должен быть напечатан следующий XML:

    <JobsInfo> <Job name='ODS_MOUVEMENT_C'> <precedants> <precedant>ODS_ECRITURE_C</precedant> <precedant>ODS_TEC_DEB</precedant> </precedants> </Job> </JobsInfo>

    если вы хотите генерировать JSON, вам необходимо заменить groovy.xml.MarkupBuilder на groovy.json.JsonBuilder.
Основная идея Groovy Transformer — использование кода Groovy в Java Transformer. Поскольку код можно писать прямо на этом этапе, вы сами можете решить, что делать — выполнять Groovy-код, который хранится в файле, поступает из параметров задания или который вы пишете сами.

Таким образом, нам нужно научиться создавать Java Transformer. Те, кто уже знает, как это реализовано, могут пропустить этот раздел.

Но я постараюсь быть кратким, поскольку документация по этой части написана достаточно подробно.

Итак, чтобы создать преобразователь Java, нам нужно создать класс, наследуемый от класса Stage:

import com.ascentialsoftware.jds.* ; class MyJavaTransformer extends Stage{ }

И необходимо реализовать три наиболее часто используемых метода: инициализировать(), процесс() и терминировать().

Метод инициализации() выполняется до того, как этап обрабатывает строки потока, и может содержать объявления объектов, которые вы собираетесь использовать на протяжении всего срока службы преобразователя.

Методprocess() выполняется в каждой строке входного потока и должен содержать логику обработки.

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

Примечание для параллельного режима преобразователя: DataStage запускает отдельную машину Java для каждого узла.

Другими словами, если у вас четыре узла, то DataStage запустит четыре JVM. Поскольку виртуальные машины изолированы, у вас нет приемлемых средств обмена данными между потоками, работающими в каждой из них.

Теперь мы готовы создать наш шаблон трансформера Java:

import com.ascentialsoftware.jds.*; public class MyJavaTransformer extends Stage { public void initialize() { trace("Init"); } public void terminate() { trace("Terminate"); } public int process() { return 0; } }

Для чтения строк, входящих и выходящих из преобразователя, вы можете использовать объект Row и два метода: readRow() для доступа к значениям входного потока и writeRow() для записи в выходной поток.

Объект Row также предоставляет возможность получать метаданные для каждого столбца и позволяет получать значения этих столбцов.

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

public int process() { Row inputRow=readRow() ; if (inputRow == null)

Теги: #etl #Datastage #Groovy #java #sql

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.