在运行时针对列动态执行转换

时间:2016-07-13 12:01:27

标签: dynamic metadata pentaho kettle

我有一个Pentaho Kettle作业,可以从x个表中加载数据,并将其放入具有不同模式的目标表中。

假设我有表1,如下:

An example source data table

我想将此表加载到如下所示的目标表中: An example destination data table

已重命名列,订单已更改,数据已转换。通过使用“选择值”步骤可以轻松管理重命名和顺序,该步骤可以在ETL元数据注入步骤中使用,使其依赖于在运行时加载的某些配置值。

但是如果我需要在某些列上执行一些转换逻辑,基于它们在目标表中的位置,这似乎不那么简单。

在我的示例中,我希望列“ CountryName ”大写,并且“评级”列将被覆盖(如将实数更改为前一个整数值)。

虽然我可以通过手动添加转换来完成每个操作,但我希望我的解决方案是动态的,因此它可以通过校验和组件轻松运行“ CountryName ”列,或者在“评级”上执行上限。

我可以轻松地将这些转换包装在另一个转换中,以便在需要时对它们进行参数化和执行: An example of a transformation wrapper

但是,我遇到麻烦的是,当我处理一行数据时,我需要一种方法来说:

  • 列“ CountryName ”应通过大写转换
  • 传递
  • 列“评级”应通过楼层转换
  • 传递
  • 列“ AnythingElse ”应通过SomeOther转换传递

有没有办法动态拆分行中的列,并根据可以提供的一些配置元数据对每个列执行不同的转换?

逻辑上,它会是这样的,虽然我怀疑可能有办法将它作为循环或某种形式的动态转换处理,而不是映射每列的路径: Logical diagram of the process - each column going to a different transform

Kettle非常灵活,似乎必须有办法做到这一点,我只是在努力知道使用哪些组件以及如何操作。那里的任何专家都有一些建议吗?

我正在处理一些较大的数据集(数亿行),因此不愿意使用Row Normaliser / Denormaliser或尽可能写入文件/数据库。

1 个答案:

答案 0 :(得分:0)

您是否考虑过修改过的Java脚本值步骤?从“数据网格”步骤,“选择值”步骤开始,然后是“修改的Java脚本值”步骤。在该步骤中,您将按照所需的格式转换每列的值,并将其输出到文件中。

当然这需要一些Java脚本知识,但鉴于您的示例,所需的知识似乎非常基本。