【问题标题】:Count the number of rows for each file along with the file name in Talend计算每个文件的行数以及 Talend 中的文件名
【发布时间】:2016-05-14 01:34:27
【问题描述】:

我已经构建了一个从文件中读取数据的作业,并根据特定列的唯一数据,将数据集拆分为多个文件。

我能够通过以下工作达到要求:

现在从将输出拆分为多个文件的这份工作中,我想要添加一个子工作,它会给我两列。

在第一列中,我想要我在主要作业中创建的文件的名称,在第二列中,我想要每个创建的输出文件的行数。

为了实现这一点,我使用了 tflowmeter 并捕获计数的结果,我使用了 tFlowmeterCatcher,它为我提供了对应输出文件的每行计数的正确结果,但给出了所有文件中的最后一个文件名我为计数生成的。

如何获得正确的文件名和相应的行数。

【问题讨论】:

  • 能否在第二个流程中使用(String)globalMap.get("tFileInputPositional_1_CURRENT_FILE") 获取当前文件名?只需将其作为值添加到tMap_2
  • @tobi6 当我使用您建议的全局参数时,它给了我空值。我使用的是 ((String)globalMap.get("row7.newColumn1")) 参数,但它给了我所有唯一记录的最后一个文件名。你能帮忙解决一些其他的逻辑吗
  • 好的,我应该把(String)globalMap.get("tFileInputPositional_1_CURRENT_FILE") 带到那里,但这也行不通,因为 tFlowMeterCatcher 是在上层作业之后执行的。你想达到什么目的?
  • 我想生成文件,每个文件都具有我在主要工作中创建的文件的名称,在第二列中,我想要每个创建的输出文件的行数。
  • 你现在如何生成tFileOutputDelimited_1中的文件名?也许您可以使用 tJavaFlex 组件来计算行数并存储文件名和行数。

标签: talend data-integration


【解决方案1】:

如果您使用以下说明,您的工作最终将具有如下附加组件:

在 main 的 tFileOutputDelimited 之后直接使用 tJavaFlex。它应该是这样的:

Start Code: int countRows = 0;
Main Code:  countRows = countRows + 1;
End Code:   globalMap.put("rowCount", countRows);

将此组件 OnComponentOk 与新子作业的第一个组件连接。该子作业包含一个 tFixedFlowInput、一个 tJavaRow 和一个 tBufferOutput

tFixedFlowInput 就在此处,以便可以连接 OnComponentOk,无需更改任何内容。在 tJavaRow 中输入以下内容:

output_row.filename = (String)globalMap.get("row7.newColumn"); 
//or whatever is your row variable where the filename is located

output_row.rowCount = (Integer)globalMap.get("rowCount");

在架构中,添加以下元素:

现在只需在第一个子作业的末尾添加一个 tBufferOutput

现在,使用组件 tBufferInput 以及您可能需要处理和存储数据的任何组件创建另一个新的子作业。使用 tBufferInput 组件将作业的第一个组件与 OnSubjobOk 连接起来。我使用 tLogRow 来显示结果(使用我随机创建的假数据):

.---------------+--------.
|      LogFileData       |
|=--------------+-------=|
|filename       |rowCount|
|=--------------+-------=|
|fileblerb1.txt |27      |
|fileblerb29.txt|14      |
|fileblerb44.txt|20      |
'---------------+--------'

注意: 请记住,如果您向文件添加标题(Include Header 签入 tFileOutputDelimited),则可能需要更改作业(只需设置int countRows = 1; 或任何你需要的东西)。我没有测试这个案例。

【讨论】:

    【解决方案2】:

    您可以使用 tFileproperties 组件来存储在第一个子作业之后在中间 excel 中生成的文件名,并在您的第二个子作业中使用此 excel。

    谢谢!

    【讨论】:

    • 如果我使用 tFileProperties 组件,流程会怎样。
    猜你喜欢
    • 1970-01-01
    • 2023-01-02
    • 2021-01-11
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    相关资源
    最近更新 更多