我不确定我是否了解Talend ETL的限制:具体而言,可以通过图形方式完成哪些工作以及通过代码必须完成的工作。
最终,我想从一个数据库的SELECT查询中存储变量并将其传递到另一个SELECT查询中,然后最终使用该查询的结果创建一个INSERT回到第一个数据库。我想我想要做的是动态修改ETL作业中数据库组件使用的(在幕后)SQL语句。这是我的具体情况。
问题:我从生产数据库中获取了一批事件,并将它们存储在数据仓库中。每次运行批处理时,我都需要查看最近运行的批处理获得的最后一个事件的ID。我将此ID存储在我的数据仓库中。使用该ID,我查询生产数据库以运行批处理。然后,我想记录该批次中事件的开始和结束ID。
注意:这些是两个物理上独立的数据库,每个数据库都需要自己的连接。
这是SQL代码(和一些伪代码):
数据库
WarehouseDB
+==============+
| BatchEvents |
+==============+
| StartingID |
| EndingID |
| ... |
+--------------+
ProductionDB
+=============+
| ProdEvents |
+=============+
| ProdEventID |
| ... |
+-------------+
第1步:
USE WarehouseDB;
SELECT MAX(EndingID) FROM BatchEvents;
我们将调用的结果值为:end_id
第2步:
USE ProductionDB;
SELECT MIN(ProdEventID) FROM ProdEvents
WHERE ProdEventID IN (
SELECT TOP 500 ProdEventID FROM ProdEvents WHERE ProdEventID > [end_id]
);
我们将调用生成的变量:new_start_id
SELECT MAX(ProdEventID) FROM ProdEvents
WHERE ProdEventID IN (
SELECT TOP 500 ProdEventID FROM ProdEvents WHERE ProdEventID > [new_start_id]
);
我们将调用的结果值为:new_end_id
第3步:
USE WarehouseDB;
INSERT INTO BatchEvents (StartingID, EndingID) VALUES ([new_start_id], [new_end_id]);
我在下面概述的问题的最佳做法是什么?如果使用Talend ETL以图形方式完成大部分工作,我将需要哪些组件;并且,如果其中一些需要在代码中完成,我在哪里绘制线?
答案 0 :(得分:1)
您有几种不同的方式来完成您的任务。假设您以OracleRDBMS为例,IMO最好的方法是以这种方式管道操作:
tOracleInput---->tOracleRow---->tParseRecordSet---->tOracleOutput
让我试着解释一下:
tOracleInput处理您的第1步,并将您的值带到传出连接(请记住匹配数据库字段/别名和Talend列名称之间的名称)
带有预准备语句的tOracleRow将使用来自传入集合的参数向RDBMS触发一般查询由于tOracleRow仅以原始形式返回ResultSet,因此需要使用tParseRecordSet实例解析为实际列
最后,一个简单的tORacleOut将进行简单的插入操作
here's a tutorial关于如何使用tOracleRow在数据流中快速查找或管道准备好的sql语句