如何从Pentaho-Kettle中基于动态选择的sql查询中获取结果集?

时间:2019-05-29 14:44:49

标签: sql select pentaho-data-integration

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

获取完整的sql查询的部分已按预期完成,但是我不知道如何继续执行sql查询的部分,以便我可以获取相应的结果集以在以后进行管理。

到目前为止,我一直没有成功尝试以下操作:

  1. Execute SQL script步骤:根据所说的here,这种步骤不会得到任何结果集。

  2. Dynamic SQL Row步骤:只要我对字段'TemplateSQL'进行硬编码,我就可以获取相应的sql,但是我不能这样做,因为从上一步派生的sql查询之间存在很大差异并且不提供固定的元数据方案。

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

如果五位水壶专家告诉我完成我想要完成的任务的正确方法,我将非常感激。

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

  1. Get Data from XML:我正在获取“ SQLQuery”字段。
  2. Set Variables:我在名为“ QUERY”的变量中设置了“ SQLQuery”字段。 (此外,正如您所说的那样设置KTR-1,也就是说,在“参数”选项卡中,我设置了一个名为“ QUERY”的参数。)

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

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步骤只希望收到一行。 我不知道我做错了什么还是错过了什么。如果您需要更多详细信息,请告诉我。谢谢。

1 个答案:

答案 0 :(得分:1)

在您共享的链接中,遵循Rishu的答案,第2部分。

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

应该看起来像这样。

enter image description here

更新答案

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

您的工作将看起来像这样:

enter image description here

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

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

enter image description here

enter image description here

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

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