将值从一个数据库传递到另一个数据库,然后再在Talend ETL中传回

时间:2014-03-19 20:57:21

标签: etl talend

我不确定我是否了解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以图形方式完成大部分工作,我将需要哪些组件;并且,如果其中一些需要在代码中完成,我在哪里绘制线?

1 个答案:

答案 0 :(得分:1)

您有几种不同的方式来完成您的任务。假设您以OracleRDBMS为例,IMO最好的方法是以这种方式管道操作:

tOracleInput---->tOracleRow---->tParseRecordSet---->tOracleOutput

让我试着解释一下:

tOracleInput处理您的第1步,并将您的值带到传出连接(请记住匹配数据库字段/别名和Talend列名称之间的名称)

带有预准备语句的tOracleRow将使用来自传入集合的参数向RDBMS触发一般查询

由于tOracleRow仅以原始形式返回ResultSet,因此需要使用tParseRecordSet实例解析为实际列

最后,一个简单的tORacleOut将进行简单的插入操作

here's a tutorial关于如何使用tOracleRow在数据流中快速查找或管道准备好的sql语句