gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:49:43 25 4
gpt4 key购买 nike

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

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

A栋B座C座....

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

我一直在尝试将 tLoop 或 tForEach 与 tIterateToFlow 一起使用,但我不确定我是否知道如何实现它。

提前致谢。

最佳答案

Gabriele's answer对我来说看起来不错。

但是,如果您发现自己在许多建筑物中拥有大量数据,以至于您可以将任何单个建筑物的行数据存储在内存中,但不能存储所有数据,那么我会倾向于使用稍微不同的方法。

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

Job Layout

在本例中,一开始我们使用 tMySqlConnection 组件打开与数据库的连接。然后,其余 2 个数据库组件(tMySqlInput 和 tMySqlRow)使用共享连接详细信息。

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

"SELECT DISTINCT building
FROM filesplittest"

这将返回每个不同的建筑物。

然后,我们遍历每个建筑物,这使我们能够在内存中仅保留该特定建筑物的记录,以便完成其余的工作。

然后,我们使用 tMySqlRow 组件通过准备好的语句来提取特定迭代构建的数据。我正在使用的示例查询如下所示:

"SELECT building, foo, bar
FROM FileSplitTest
WHERE building = ?"

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

tMySqlRow advanced settings for prepared statement

我已经说过,第一个参数(参数索引 = 1)是我们之前检索到的构建值,tFlowToIterate 帮助我们将其推送到 globalMap,因此我们使用 ((String)globalMap 从那里检索它在本例中为 .get("row6.building"))(它是 row6 流中的“building”列)。

使用准备好的语句时,您需要将数据作为记录集对象检索,因此您需要像这样设置 tMySqlRow 的架构:

tMySqlRow schema

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

tParseRecordSet component

使用适合此示例的架构:

tParseRecordSet schema

然后我们需要迭代这组数据,将其附加到适当命名的 CSV 中。为此,我们使用另一个 tFlowToIterate 组件,并通过 tFixedFlowInput 组件进行稍微烦人的绕道,从 globalMap 中读取每条记录的数据,然后将其传递给 tFileOutputDelimited:

tFixedFlowInput configuration to read data in from the globalMap

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

tFileOutputDelimited append and dynamic file name from globalMap

请注意,附加复选框已选中,否则作业的每次迭代都会覆盖前一次。我们还根据构建列中的值来命名该文件。

<小时/>

正如 Gabriele 提到的,如果您的数据始终适合内存,您可以简化工作,只需将数据读入 tHashOutput 组件,然后过滤哈希中的数据:

Simplified job layout with hash and keeping everything in memory

我们首先将所有数据读入 tHashOutput 组件,然后在整个作业过程中将数据保留在内存中。 Talend 有时会出于某种奇怪的原因隐藏这些组件,但您可以通过将它们添加回项目属性 -> 设计器 -> 调色板设置来重新启用它们:

How to re-enable the tHash components

接下来,我们使用 tHashInput 组件(链接到之前的 tHashOutput 组件 - 不要忘记将相同的架构添加到 tHashInput 组件)从哈希中读回数据,然后使用 tAggregateRow 组件并按“构建“有效地体现建筑值(value):

tAggregateRow settings

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

tFilterRow configuration

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

tFileOutputDelimited

关于etl - 如何根据 SQL 输入中的列在 Talend 中创建多个输出文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25684433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com