如何在Talend中动态地将文件名传递给tFTPRename?

时间:2014-07-17 18:33:46

标签: java global-variables etl talend

我目前的工作是这样的:

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组件,但没有一种方法正常工作。

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

我也在互联网上尝试了几种方法,但没有一种方法有效,所以我不确定它是不是我或者是否与tFTPRename功能有关。

主要工作: Main Job 作业前准备: PreJob tFTPRename组件: tFTPRename Component tFileInputFullRow: File Name Read

1 个答案:

答案 0 :(得分: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组件再次检索它的基本示例:

Job layout showing data being put into the globalMap by the tFlowToIterate component

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

Retrieving the data from the globalMap