Pentaho 将变量从修改后的 java 脚本值传递到表输入

Posted

技术标签:

【中文标题】Pentaho 将变量从修改后的 java 脚本值传递到表输入【英文标题】:Pentaho passing variable from modified java script value to table input 【发布时间】:2017-04-27 02:05:11 【问题描述】:

我需要从修改后的 java 脚本值中传递变量并将其传递给表输入查询

这是我的

如果我点击预览输出

initator_reference | a | ''   |
1                  | a | null |
2                  | a | null |
3                  | a | null |
4                  | a | null |

它不应该为空,而是第三个字段上的“测试”字符串 不要问我为什么我把那个变量放在select中,它只是为了在我把它放在“where condition=variable”之前进行测试

【问题讨论】:

【参考方案1】:

表格输入支持使 SQL 动态化的两种不同方式:变量替换和从传入流中插入数据。

变量替换

这是您当前在表格输入中配置的内容:您将 $variable 放在某处,当步骤初始化时,该值将作为文本粘贴到 SQL 中。

由于所有步骤在转换中同时初始化,因此您的 javascript 步骤没有时间设置值。在 PDI 中,您不能在同一转换中设置和使用变量

插入步骤中的数据

第二种方法是通过在表格输入的“从步骤中插入数据”选项中选择一个源步骤来使用。在这种模式下,表格输入从选定的步骤中取出一行,并将字段(按顺序)插入到您插入的问号 (?) 处的 SQL 中。通常它需要一行,但您可以选择为每一行执行。

这种方式应该适用于您的场景:

    在开始处放置一个 Generate Rows 步骤并将其设置为生成 1 行。 将其连接到 Javascript 步骤。 在 Javascript 步骤中,将返回变量指定为底部网格中的输出字段,它将被添加到流中。 在表格输入中,选择“从步骤插入数据”处的 Javascript 步骤 在您的 SQL 中,插入 ?在变量的位置。如果值是字符串,您可能需要用单引号括起来:WHERE column = '?'。 预览转换以查看结果,表格输入的预览由于依赖关系而被禁用。

注意事项:

步骤 1 和 2 可能不需要,我不确定 JS 步骤是否自己生成一行。我喜欢明确说明这一点,通常将 Generate Rows 步骤命名为“Generate 1 row”。 如果您有一个现有的流或多个要插入的字段,您可以使用“选择值”步骤将字段按需要插入 SQL 的顺序放置。

【讨论】:

已经完成了你的步骤,但表格输入错误,请参阅我的答案部分的图片(第二张图片) @AlexanderChandra:在你的第二张照片中,我看不到 ?在您的表格输入中。您可能会收到错误“未知列...”。试试单引号。 我们如何用逗号分隔的字符串替换变量来运行查询,例如 where a column in (?)。我尝试将此字符串发送到表输入,但替换不计算?括号内。我尝试通过字符串连接 () 然后直接发送到?在表输入中,但这不起作用,因为 PDI 添加了“”它就像“(myCommaSeparatedStrings)”,这我的查询失败了。 @Navroop 这几乎是一个新问题,而不是评论。这 ?如您所见,由于转义,插入仅适用于简单字符串。如果您在 where 子句中需要可变数量的值,您可能会更幸运地构建自定义 SQL 语句并使用 SQL 步骤。【参考方案2】:

我自己找到了解决方案 第一步是修改java script value->set variables 然后获取变量->表格输入(检查脚本中的替换变量),您只需要放置“?”到您的查询(这个“?”字符串是您的变量,我不知道是否有任何其他方式来调用变量)

提醒一下,pentaho 上的 javascript 与真正的 javascript 有点不同

【讨论】:

也许他们在以后的版本中改变了一些东西,但根据我的经验,这应该行不通。据我所知,如果没有输入,则根本不应该处理 JS 步骤。并且 Get Variable 步骤应该与 JS 和 Set Variables 步骤并行处理。您确定该值是 JS 步骤中设置的值吗?它不仅仅是在获取变量步骤或 ktr 属性中设置的默认值?并且在 Spoon 重新启动后第一次运行 ktr 时,JS 的值被拾取? 好吧,我刚刚发现了问题,我第一次运行预览它显示今天日期 - 10(我的 javascript)然后我将我的 javascript 更改为今天 8 并且它仍然显示今天 10。你有解决办法吗? @Cyrus 建议的方法应该可行。基本上,您需要将单行输入放入 JS 步骤(您可以使用 Detect empty stream 步骤:它不会生成列,因此您不需要删除它们),然后放置您的 Table 输入而不是您的 Set 变量step 并将“Input data from step”替换为指向 JS 步骤。最后删除设置/获取变量步骤。它应该可以工作。

以上是关于Pentaho 将变量从修改后的 java 脚本值传递到表输入的主要内容,如果未能解决你的问题,请参考以下文章

Pentaho Kettle 中的 while 循环实现

有人有任何关于如何使用修改后的 Java 脚本值处理返回 Json (url) 的示例吗?

如何修改从java传递给jni的int参数

Pentaho 数据集成 setVariable 不起作用

Pentaho行变量

如何在 Pentaho Spoon UI 中输入多行值?