【问题标题】:How to get a resultset from a dynamic select-based sql query in Pentaho-Kettle?如何从 Pentaho-Kettle 中基于动态选择的 sql 查询中获取结果集?
【发布时间】:2019-05-29 14:44:49
【问题描述】:

我想执行一组基于选择的 sql 查询,这些查询源自 XML 文件中的 xml-node 元素,并将相应结果集的值写入 CSV 文件。我想澄清一下,sql查询的任何字段都没有参数化,但是完整的sql查询本身就是。

获取完整的sql查询部分按预期完成,但不知道如何进行启动sql查询的部分,以便稍后获取相应的结果集进行管理。

到目前为止,我尝试过但没有成功的方法如下:

  1. Execute SQL script step:按照here的说法,这种step不会得到任何结果。

  2. Dynamic SQL Row 步骤:只要硬编码字段“TemplateSQL”,我就会得到相应的 sql,但我不能这样做,因为从上一步派生的 sql 查询在它们之间非常不同并且不要'不提供固定的元数据方案。

  3. Table Input 步骤:此步骤只允许参数化 sql 查询的单个值,而不是完整的查询。

如果有 pentaho-kettle 专家能告诉我完成我想做的任务的正确方法,我将不胜感激。

更新(按照@Cristian Curti 的说明): 问题出现在 KTR-1 中。当您说 “您必须将此查询作为变量传递给另一个 KTR” 时,我知道我首先要做的是在变量中设置 xml-node 值,然后将其传递给KTR-2。为此,在我的 KTR-1 中,我使用了以下步骤:

  1. Get Data from XML: 我得到了 'SQLQuery' 字段。
  2. Set Variables:我在一个名为“QUERY”的变量中设置了“SQLQuery”字段。 (另外,KTR-1是按你说的设置的,也就是在Parameters选项卡中我设置了一个名为'QUERY'的参数)。

当我预览 KTR-1 的第二步时,Kettle 控制台记录以下错误:

Get data from XML.0 - Finished processing (I=2, O=0, R=0, W=2, U=0, E=0)
Set variables.0 - Setting environment variables...
Set variables.0 - Set variable QUERY to value [        
  SELECT "Table1".*, "table2"."field1" FROM "Table1" INNER JOIN "Table2" ON Table1"."PATIENT" = "Table2"."PATIENT" WHERE ("Table1"."field1" > Table1"."field2") AND NOT("field1" BETWEEN 'date1' AND 'date2')     
]
Set variables.0 - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-1-14 10.30.55 by buildguy) : Unexpected error
Set variables.0 - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-1-14 10.30.55 by buildguy) : org.pentaho.di.core.exception.KettleStepException: 
Set variables.0 - Only 1 input row was expected to set the variables and at least 2 were received.

似乎Set Variables step 只希望收到一行。 我不知道我是做错了什么还是错过了什么。如果您需要更多详细信息,请告诉我。谢谢。

【问题讨论】:

    标签: sql select pentaho-data-integration


    【解决方案1】:

    从您分享的链接中,按照 Rishu 的回答,第 2 部分。

    在您从 XML 节点获取查询的部分,您必须将此查询作为变量传递给另一个 KTR,并在第二个 KTR 的输入表步骤中,在 SQL 编辑器中使用 ${variable}步骤。

    应该看起来像这样。

    更新答案

    不,您使用了错误的方法。当您知道只有 1 行将到达该步骤时,您可以使用“设置变量”步骤,当您有多行到达“结果集”时,您需要使用“复制行”>“为每一行执行”方法。这需要执行 1 个 Job 和 2 个 KTR。

    您的工作将如下所示:

    您的第一个 KTR 的最后一步是“将行复制到结果”。

    在 Job 中,您需要这样配置您的第二个 KTR 条目:

    Stream 列名必须与包含要执行的查询的第一个 KTR 中的列名匹配,另外,第二个 KTR(第一个答案图片)中的命名参数必须与 JOB 配置中的参数匹配,如图片显示。

    之后您所要做的就是为第二个 KTR 上的每个查询生成一个动态文件名,通常所有生成文件的输出步骤都有一个“在文件名中包含日期”和一个“在文件名中包含时间”,两者都应该使用足以零努力地生成不同的文件名,并且您可以获得文件创建时间的时间戳。

    【讨论】:

    • 感谢您的回复。不幸的是,我没有让事情发挥作用。你能看到我的更新吗?谢谢。
    • @txapeldot 更新了我的答案。
    • 太棒了!我已经设法让它工作了。您的回复不仅解决了我的问题,还帮助我了解了 Pentaho-Kettle 的工作原理。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2021-04-15
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    相关资源
    最近更新 更多