如何根据SQL输入中的列在Talend中创建多个输出文件

Vir*_*ato 5 etl talend

我需要根据Talend Open Studio中sql输入的值(列)创建多个输出文件.

我的tMSSQLInput返回大约50,000行,其中一列是building_name

建筑物B楼C楼....

因此,具有值"Building A"的所有行都应位于名为"buildingA.xls"的excel文件中,所有具有"Building B"的行应位于名为"buildingB.xls"的excel文件中,依此类推.

我一直在尝试使用tLoop或tForEach以及tIterateToFlow,但我不确定我是否知道如何实现它.

提前致谢.

yda*_*coR 7

Gabriele的回答对我来说非常好.

但是,如果您发现自己处于这样一种情况:您可以在很多建筑物中拥有大量数据,以至于您可以在内存中存储任何单个建筑物的行数据而不是所有内容,那么我倾向于使用方法略有不同.

在这个示例作业中,我正在使用MySQL数据库组件,因为我碰巧有一个本地MySQL数据库,但是关于此作业的所有内容也适用于Oracle或MS SQL Server:

工作布局

一开始,我们在这种情况下使用tMySqlConnection组件打开与数据库的连接.其余2个数据库组件(tMySqlInput和tMySqlRow)然后使用共享连接详细信息.

我们首先使用tMySqlInput中的以下查询来获取数据库中的建筑物列表:

"SELECT DISTINCT building
FROM filesplittest"
Run Code Online (Sandbox Code Playgroud)

这会返回每个不同的建筑.

然后我们遍历每个建筑物,这使我们能够将剩余工作中的特定建筑物的记录保留在内存中.

然后,我们使用tMySqlRow组件使用预准备语句为该特定的迭代构建提取数据.我正在使用的示例查询如下所示:

"SELECT building, foo, bar
FROM FileSplitTest
WHERE building = ?"
Run Code Online (Sandbox Code Playgroud)

然后我们在高级设置中配置预准备语句:

tMySqlRow准备语句的高级设置

我已经说过第一个参数(参数索引= 1)是我们之前检索到的构建值,而tFlowToIterate是我们帮助推送到globalMap的,所以我们((String)globalMap.get("row6.building"))在这种情况下从那里检索它(它是"构建"列,是在第6行).

使用预准备语句时,您需要将数据作为记录集对象检索,因此您需要设置tMySqlRow的模式,如下所示:

tMySqlRow架构

然后我们使用tParseRecordSet组件解析它:

tParseRecordSet组件

使用适合此示例的模式:

tParseRecordSet架构

然后我们需要遍历这组数据,并将其附加到适当命名的CSV.要做到这一点,我们使用另一个tFlowToIterate组件,并通过tFixedFlowInput组件稍微烦人的绕道从globalMap读取每个记录的数据,然后将其传递给tFileOutputDelimited:

tFixedFlowInput配置从globalMap读取数据

最后我们附加到以建筑物命名的CSV:

tFileOutputDelimited来自globalMap的追加和动态文件名

请注意,选中了附加复选框,否则作业的每次迭代都将覆盖前一次.我们还按建筑列中的值命名文件.


正如Gabriele所提到的,如果您的数据始终满足于内存,您可以通过将数据读入tHashOutput组件然后过滤哈希中的数据来简化作业:

使用哈希简化作业布局并将所有内容保留在内存中

我们首先将所有数据读入tHashOutput组件,然后在整个作业中将数据保存在内存中.Talend有时会出于某种奇怪的原因隐藏这些组件,但您可以通过在Project Properties - > Designer - > Palette设置中添加它们来重新启用它们:

如何重新启用tHash组件

接下来,我们使用tHashInput组件从散列中读回数据(链接到先前的tHashOutput组件 - 不要忘记将相同的模式添加到tHashInput组件)然后使用tAggregateRow组件并通过"构建"来有效地分组采取不同的建筑价值:

tAggregateRow设置

然后,我们使用tFlowToIterate迭代"构建"的不同值,然后通过当前正在迭代的构建值过滤哈希(第二次读取):

tFilterRow配置

最后,我们再次确保附加到以构建列中的值命名的文件:

tFileOutputDelimited