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") ;
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.
Таким образом, нам нужно научиться создавать 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
-
Все О Спаме
19 Oct, 24 -
Тонкости При Работе С Инозаказчиком
19 Oct, 24 -
Информация О Пользователях Священна
19 Oct, 24 -
Пользователи «Солиют» На Sup Сервере
19 Oct, 24