Talend:更新subjob中的全局变量

54l*_*l3d 5 talend

我简化的工作看起来像这样:

tSetGlobalVar --->(onSubJobOK)---> tRunJob --->(onSubJobOK)---> tJava

  • tSetGlobalVar将定义一个全局变量,其初始值可以说: myKey:"firstValue"
  • tRunJob将运行一个子作业,该子作业只包含第二个tSetGlobalVar组件,该组件应该为主作业中定义的全局变量设置一个新值: ((String)globalMap.get("myKey")): "newValue" 也试过这个: "myKey": "newValue"
  • tJava只用于调试,它的代码如下: System.out.println(((String)globalMap.get("myKey")));

实际产量: firstValue

预期产量: newValue

有没有其他方法可以修改子工作中的全局变量的值并获取主作业中的更新值?

yda*_*coR 8

您应该使用上下文变量而不是globalMap将数据传递给子作业.然后,使用子作业中的tBufferOutput将数据传递回父作业.

作为一个例子,这是一个非常基本的设置,它接受一个id和一个日期,并将它传递给一个子作业,它只是将它打印到控制台/日志,然后将一些数据传递回父也只是打印到控制台/日志.

家长: 父作业布局

父作业中tFixedFlowInput中的数据如下: 父tFixedFlowInput

请注意您必须如何为键使用键值对组合,并将值传递给tContextLoad组件,然后tContextLoad组件将创建由键命名并保持定义值的上下文变量.

在父作业中,我们设置iddate上下文变量,然后立即打印作业的当前上下文(将包括刚刚设置的上下文变量).

在此之后,我们使用tRunJob组件集调用子作业来传递整个上下文:

tRunJob配置调用子作业并传递上下文变量

或者,您可以通过取消Transmit whole context选项并明确定义要发送的上下文来指定传递给子作业的上下文变量.此处也可以定义上下文变量的值,但通常在作业的主流中生成上下文变量值并将它们作为键值对传递给tContextLoad组件更有意义.

儿童工作: 儿童工作布局

在子作业中,我们只是通过使用tContextDump组件将它们转储到tLogRow来打印已发送的上下文,然后在这种情况下我们使用另一个tFixedFlowInput来硬编码一些数据:

子作业tFixedFlowInput数据

然后我们将其传递给tBufferOutput组件,该组件允许我们在父作业中读取数据.

回到父作业,然后我们将tLogRow链接到带有主链接的tRunJob,并提供子作业的tBufferOutput中的模式.然后,这将打印来自子作业的数据.

然后,示例作业的输出是:

.----+----------.
|Parent Contexts|
|=---+---------=|
|key |value     |
|=---+---------=|
|date|2014-10-30|
|id  |12345     |
'----+----------'
.----+----------.
|Child Contexts |
|=---+---------=|
|key |value     |
|=---+---------=|
|date|2014-10-30|
|id  |12345     |
'----+----------'
.-----+----------.
|Child Data to be Passed to Parent|
|=----+---------=|
|id   |date      |
|=----+---------=|
|12346|2014-10-31|
'-----+----------'

.-----+----------.
|Output from Child1|
|=----+---------=|
|id   |date      |
|=----+---------=|
|12346|2014-10-31|
'-----+----------'
Run Code Online (Sandbox Code Playgroud)

globalMap将数据存储在作业本身中,并且根本不与父作业或子作业共享,因此不能用于此目的.


Rob*_*Zag 4

在 Talend 中,您可以将上下文变量传递给子作业,它们的工作方式类似于标准 Java 变量,因此,如果您传递不可修改的内容(如字符串或基本类型),您将不会得到任何更改,但如果您传递“按引用”类型,您将更改您的对象,您将看到子作业所做的更改,因为父作业仍然保留对已更改对象的引用。

因此,问题的解决方案就是简单地将 globalMap 从父作业传递到子作业,这样子作业就可以读取和更改该映射,而父作业将看到任何更改。您传递的映射将与子作业的 globalMap 不同,并且仅在您使用它的地方使用。

不幸的是,Talend 只有一种“通过引用”类型:对象类型,因此您需要将任何内容作为对象传递,然后将其转换回您将使用它的位置,但我认为这不是一个大问题。

以下是该工作的图片: 运行父亲 父亲的工作与执行结果

把地图递给孩子 在此输入图像描述

子进程从上下文变量中检索映射并使用该映射 在此输入图像描述