PDI文本输出步骤中的动态日期格式

时间:2019-07-02 16:26:42

标签: pentaho-data-integration

我正在使用PDI运行存储在oracle DB中的sql查询,然后使用文本文件输出步骤将结果提取到文件中。每个摘录都不同,所以我无法设置输出字段。如何将输出的日期格式默认为该特定提取所指定的格式?

我有一个查询表,其中包含SQL查询和查询所需的日期格式。

我意识到我可以对查询本身使用格式化,但是我想知道是否可以在PDI中完成。实际上有数百种,这意味着工作量将大大减少。

2 个答案:

答案 0 :(得分:0)

我知道没有标准的方法。当然要使用User Defined Java ClassMetadata Injector

但是,直到您要在文件中写入数据格式时,PDI中的数据格式才是无关紧要的。而且即使您在输入上有数百种可能(根本不会打扰Kettle),我相信您在输出上只有很少的可能性。

因此,在最后一个输出步骤之前,在表中进行查找,然后切换到适当的Select value步骤,在Metadata tag中,您可以将格式附加到Date字段,在将Text output步骤中的流放入未指定字段之前。

答案 1 :(得分:0)

好吧,我不知道这是否有帮助,但这是我提取日期并在Text File Output步骤甚至Table Input/OutputExecute SQL Step中使用它的目的。

在“作业级别”中执行此操作,将其拆分为某些转换,然后使用Set variableCopy row to result步骤。

第一个转换称为 DateTime转换 在此转换中,您将创建动态日期时间值,稍后我们将使用它。

  1. 使用Get System Info步骤,使字段[Fieldname]的类型为system date (variable)。 [Fieldname]将包含该转换运行时的当前日期时间。

  2. 添加Calculator步骤,在此您将Get System Info的日期时间[Fieldname]分为几部分。

示例。 (关注此专栏) 通常我将其分为天,月,年,小时,分钟

New Field  | Calculation                   | Field A     | Value type
---------------------------------------------------------------------
Daytrans   | Day of month of Date A        | [Fieldname] | String
Monthtrans | Month of Date A               | [Fieldname] | String
Yeartrans  | Year of Date A                | [Fieldname] | String
Hour       | Hour of Day of Date A         | [Fieldname] | String
Minute     | Minute of Hour of Date A      | [Fieldname] | String
Filename   | Set Field to Constant Value A | "Filename_" | String

注意。 “文件名_”,不带引号。

  1. 使用Formula步骤将日期合并为任意格式。

示例。 (yyyymmdd,yyyy / mm / dd)

New Field  | Formula                                                          | Value type
------------------------------------------------------------------------------------------
yyyymmdd   | [Filename] & [Yeartrans] & [Monthtrans] & [Daytrans]             | String
yyyy/mm/dd | [Filename] & [Yeartrans] & "/" & [Monthtrans] & "/" & [Daytrans] | String

注意。 您可以根据需要创造性地设置日期时间格式

并在公式中创建如下条件:

[Yeartrans] & if([Monthtrans] < 10; "0" & [Monthtrans]; [Monthtrans]) & if([Daytrans] < 10; "0" & [Daytrans]; [Daytrans])

我通常在我希望结果像这样的20190701时使用它。 为什么?因为如果不使用if,结果将像是201971,而在2019年7月1日没有0

  1. 使用Select Value步骤来过滤要使用的字段,仅此[yyyymmdd]和此[yyy / mm / dd]字段。

  2. 最后一次使用Set variableCopy row to result步骤,因此您可以在其他转换中使用它。

第二次转换称为数据处理

  1. 使用Get Row from resultGet Variable步骤
  2. 这是您的数据,无论它是什么,都可以从表中执行查询,什么都可以。
  3. Text File Output步骤,在文件名框中进行配置,您只需要使用以下命令调用变量:${Variablename}

完成。并且不要忘记在Text File Output Fields标签中,使用buttom Get Field自动填写或您自己手动填写。

您还可以在查询中使用该datetime变量,只需选中variable subtitution步骤中的Execute Query框或Replace variable in script步骤中的Table Input框即可。或使用连接行(笛卡尔)通过连接2源将其输出为文件中的数据

结果将如下所示:Filename_20190701.csv

对不起,英语写得不好,但希望能有所帮助。