我正在寻找一种可嵌入的 Java ETL,即可以从 Java 代码调用的 Extract Transform Load 引擎。
我发现很难找到合适的。
我主要关注将分隔的文本文件加载到数据库表中,并在此过程中进行一些小的转换。
我想要以下功能:
- 能够在外部指定简单映射,例如,文本列 5 到数据库列 foo,指定一些 xml 映射文件
- 为数据库节点提供 javax.sql.Datasource 的能力
CloverETL 允许在 XML 中指定映射,但数据库连接必须是 JNDI 名称或指定驱动程序类、url、dbusername、密码等的属性文件。因为我已经有了 javax.sql.Datasource
s 由我的依赖注入(inject)框架设置,属性文件看起来很痛苦且不健壮,特别是如果我希望它在多个环境(开发、测试、产品)中工作。
KETL 告诉我“我们目前正在彻底检查 KETL™ 的文档。因此,仅更新了安装指南。”诚实,但没有帮助。
Octopus 现在是“http://www.together.at/prod/database/tdt”,正在“ build 中”。
Pentaho 似乎使用与 CloverETL 相同的“指定驱动程序类”样式,而不是使用数据源,但 Pentaho 从 java 代码调用其引擎的文档很难找到。
基本上我真的很想能够做这个伪代码:
extractTransformLoad(
getInputFile( "input.csv" ) ,
getXMLMapping( "myMappingFile.xml") ,
new DatabaseWriter( getDatasource() );
有什么建议吗?
最佳答案
披露:我是 Scriptella ETL 的作者,但我相信此工具可能对您的情况有用。
它是一个轻量级的开源 ETL,与 Java 单线集成。它还 supports Spring Framework并附带built-in drivers适用于 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 example .
关于Java ETL : hard to find a suitable one,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4251336/