Java ETL: трудно найти подходящую
Я ищу встраиваемый Java ETL, т.е. механизм Load Extract Transform Load, который можно вызывать из кода Java.
Мне неожиданно трудно найти подходящую.
Я в основном смотрю на загрузку текстовых файлов с разделителями в таблицы базы данных с некоторыми незначительными преобразованиями на этом пути.
Мне нужны следующие функции:
- возможность указания простых сопоставлений извне, например текстового столбца 5 в столбец базы данных foo, указан некоторый файл сопоставления xml
- способность предоставить базу данных node javax.sql.Datasource
CloverETL позволяет сопоставлять отображение в XML, но соединения с базой данных должны быть либо именами JNDI, либо файлом свойств, определяющим driverClass, url, dbusername, password и т.д. Поскольку у меня уже есть javax.sql.Datasource
, настроенный моей инфраструктурой инъекций зависимостей, свойства файлов кажутся болезненными и ненадежными, особенно если я хочу, чтобы это работало в нескольких средах (dev, test, prod).
KETL говорит мне, что "мы в настоящее время полностью пересматриваем нашу документацию для KETL ™. Из-за этого обновлено только руководство по установке". Честный, но не полезный.
Octopus теперь "http://www.together.at/prod/database/tdt", который находится в стадии разработки.
Pentaho, похоже, использует тот же самый стиль, что и CloverETL, а именно, что использование источника данных, но документация Pentaho для вызова их движка из Java-кода просто трудно найти.
В принципе, мне очень хотелось бы иметь возможность сделать этот псевдокод:
extractTransformLoad(
getInputFile( "input.csv" ) ,
getXMLMapping( "myMappingFile.xml") ,
new DatabaseWriter( getDatasource() );
Любые предложения?
Ответы
Ответ 1
Раскрытие информации: Я являюсь автором Scriptella ETL, но я считаю, что этот инструмент может быть полезен для вашего дела.
Это легкий ETL с открытым исходным кодом с однострочной интеграцией с Java. Он также поддерживает Spring Framework и поставляется с встроенными драйверами для CSV, текста, XML, Excel и других источников данных.
Пример импорта CSV файла в таблицу:
<!DOCTYPE etl SYSTEM "http://scriptella.org/dtd/etl.dtd">
<etl>
<connection id="in" driver="csv" url="data.csv" />
<connection id="out" driver="oracle" url="jdbc:oracle:thin:@localhost:1521:ORCL"
classpath="ojdbc14.jar" user="scott" password="tiger" />
<!-- Copy all CSV rows to a database table -->
<query connection-id="in">
<!-- Empty query means select all columns -->
<script connection-id="out">
INSERT INTO Table_Name VALUES (?id,?priority, ?summary, ?status)
</script>
</query>
</etl>
Работа с Java:
// Execute etl.xml file
EtlExecutor.newExecutor(new File("etl.xml")).execute();
Запуск из командной строки:
scriptella [file_name]
Интеграция с Spring:
-
Используйте драйвер "spring"
и имя bean для ссылки на источники данных. Пример:
<connection id="spring" driver="spring" url="datasourceBeanName" />
-
Добавьте EtlExecutorBean
в контекст приложения для выполнения задания:
<bean id="createDb" class="scriptella.driver.spring.EtlExecutorBean">
<property name="configLocation" value="create-db.etl.xml" />
<property name="progressIndicator"><ref local="progress" /></property>
<property name="autostart" value="true" /> <!-- Etl will be run during app context initialization -->
</bean>
Подробнее см. Spring пример.
Ответ 2
Знаете ли вы Talend?
Это инструмент, основанный на Eclipse (Talend Open Studio), но вы можете использовать его непосредственно в Java, написав свой собственный код или экспортируя задания в классы Java.
Ответ 3
Здесь - список всех библиотек ETL с открытым исходным кодом на основе Java. Я вижу, что вы уже немного оценили их, но их больше. Также это дубликат https://stackoverflow.com/questions/272517/please-recommend-a-powerful-java-based-etl-framework
Ответ 4
CloverETL Engine легко встраивается, а также расширяется, поэтому вы можете написать свое собственное подключение и подключить его к CLoverETL. Объект DBConnection будет немного изменен в CloverETL 3.1, чтобы быть более расширяемым, а реализация его потомка, который использует DataSource для подключения к базе данных, будет играть роль ребенка.