【问题标题】:How to dynamically pass filename to tFTPRename in Talend?如何在 Talend 中将文件名动态传递给 tFTPRename?
【发布时间】:2014-07-17 18:33:46
【问题描述】:

我目前的工作是这样的:

tPrejob-->tOracleConnection1--->tOracleConnection2--->tSetGlobalVar1(timestamp)--->tRunjob(运行prejob从FTP收集文件)

然后有一个 tPostjob 应该在 FTP 服务器上重命名处理过的文件。

tPostjob--->tFTPRename

应该用"File Processed On " + ((String)globalMap.get("timestamp")) + "This is where I would put the orginal file name"重命名文件

如果我将标准文件名放入 Filemask,那么它将正确运行,但是如果我尝试通过 globalMap.get 将文件名传递给它来使文件掩码动态化,那么我会收到错误:

“组件 tFTPRename_1 java.lang.NullPointerException 中的异常”

我尝试了几种将文件名传递给 tFTPRename 组件的方法,但都没有奏效。

我目前正在捕获子作业中的文件名并将其输出到 txt 文件,然后在主作业上使用 tFileInputFullRow 来创建该变量。我尝试将其传递给 tSetGlobalVar,然后将其作为 ((String)globalMap.get("FileName")) 添加到文件掩码中,但没有运气。

我也在网上尝试了几种方法,但都没有奏效,所以我不确定是我的问题还是与 tFTPRename 功能有关。

主要工作: 工作前: tFTPRename 组件: tFileInputFullRow:

【问题讨论】:

  • 你能附上一些你工作的截图吗?我认为您可能在这里过于复杂了您的过程。作业布局的屏幕截图,然后是一些关键组件的配置屏幕截图,或在您的问题中以文本形式扩展它们的配置方式。
  • 尽可能多地添加

标签: java global-variables etl talend


【解决方案1】:

听起来你在某些时候使用了错误的 globalMap,这肯定会解释空指针异常,因为 globalMap 变量似乎没有被设置。

通常,tSetGlobalVar 组件用于将静态或运行时生成的变量设置到 globalMap 中,我认为您实际上不能将数据传递给它,然后它可以直接使用并推送到 globalMap。您的日期时间戳很好地使用了该组件,但您需要使用 tFlowToIterate 组件或使用 tJava(Row) 组件来强制数据进入 globalMap 使用类似的东西:

globalMap.put("fileName",inputrow.fileName);

查看您的previous question,那么您应该在您在前工作中调用的工作中从 FTP 获得文件的名称。通常,您可以在此处将其作为主要流程的一部分运行到 tBufferOutput 组件中,然后将数据直接读取到父作业中(只需将主要流程连接器从 tRunJob 组件连接到您要处理的下一个组件数据流,不要忘记为 tRunJob 组件提供与您的子作业的 tBufferOutput 相同的架构。

但是,这里有一个复杂之处,因为您已经使用缓冲区从 tFTPList 组件中捕获所有可迭代对象,因此您需要转到临时平面文件或数据库进行推送,这是正确的状态返回到父作业。

虽然您应该能够从这里读取包含父作业中字段名称的平面文件或数据库表,然后轻松运行,但您可以将其连接到 tFlowToIterate 组件,然后将该数据存储在globalMap(这里应该有 1 行 1 列数据,所以它是一个变量)。

这是一个基本示例,将 tFixedFlowInput 中的一些硬编码数据运行到 tFlowToIterate 以将其放入 globalMap,然后使用另一个 tFixedFlowInput 组件再次检索它:

一旦数据在 tFlowToIterate 组件中,您就可以轻松地使用 globalMap.get(rowName.schemaColumnName) 或通过按 ctrl+space 并在 tFlowToIterate 组件下选择它来调用它:

【讨论】:

  • 如果我在 tSetGlobalVariable 之后添加一个 tLogRow,我会返回 FileName,所以它应该输出一些东西。我有 tFileInputFullRow-->tFlowToIterate-->tSetGlobalVar,然后在全局变量组件中,我将它设置为键:“FileName”和值:((String)globalMap.get(“row1.ProcessedFileName”))。然后在 tFTPRename 中,我将文件掩码设置为 ((String)globalMap.get("FileName"))。是的,我知道我可以做到这一点,我只需要大约 6 个不同位置的时间戳,每个位置都需要重新格式化以删除 : 和 - 并且更容易将其设置为全局格式。
  • 您是从 globalMap 中获取 ProcessedFileName,然后将其作为 FileName 放入 globalMap 中?为什么?我需要在这里查看您工作的详细屏幕截图,但看起来您过于复杂了。
  • 我尝试了上述方法,但在 tFTPRename 中不起作用。它仍然给出了空指针错误。我还尝试将 tFlowToIterate 输出到 logrow,它确实在输出中生成了文件名,所以我相信它配置正确。我只是不确定为什么 tFTPRename 没有读取它。
  • 更新:另外,如果我将 ((String)globalMap.get("row1.ProcessedFileName")) 变量传递到正在为数据库处理的文件输入中,那么它会正确读取文件名并且处理文件。 :/ 我不知道为什么它不会在 FTP 重命名中做同样的事情
  • 哦。这可能是一个红鲱鱼。看起来您尚未在 tFTPRename 中选择建立连接的组件。在这种情况下,您的连接仅在 prejob 中运行的子作业中进行。因此,您需要在 postjob 中使用新的 tFTPConnection 组件,或者直接在 tFTPRename 中连接。
猜你喜欢
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 2020-08-04
  • 2019-05-08
  • 1970-01-01
相关资源
最近更新 更多