在不同的相同Kettle作业/转换格式中使用可变DB连接

时间:2018-10-19 10:15:23

标签: database variables connection etl kettle

我在这里已经阅读了许多相关主题,但似乎没有找到解决方案。这是我的情况:

  • 我有多个相同的客户数据库
  • 我使用ETL填充这些数据库中的特殊表,以便用作PowerBI报告的来源
  • 我不想复制(从而维护)每个客户的ETL,而是希望将数据库连接动态传递给Jobs / Transformations

我的计划是为每个客户创建一个数据库连接的文本文件:

cust1,HOST_NAME,DATABASE_NAME,USER_NAME,PASSWORD cust2,HOST_NAME,DATABASE_NAME,USER_NAME,PASSWORD 等等...

主机将始终保持不变。

作业将每月在Linux盒子中使用Pentaho厨房启动。

因此,当我为特定客户运行作业时,我想告诉该作业使用该特定客户(即Cust2)的数据库连接。从连接文件中。

非常感谢您的帮助。 谢谢, 平子

2 个答案:

答案 0 :(得分:1)

我每天在工作中也会遇到类似的情况。我们要做的是为每个客户端使用带有命名参数的批处理文件,这样我们就可以完全基于这些参数为相同的客户端运行相同的KJB / KTR程序包。

您要做的是在主作业上设置变量,这些变量将在整个执行过程中使用。

直接针对您的问题,在连接创建选项卡中,可以在Host和DBname中使用这些变量。就个人而言,我们在每个客户端数据库上都设置了相同的用户/密码,因此我们不必更改这些密码或将用户/密码作为每个连接的变量传递,我们仅使用Named Parameters发送主机名和数据库。我们还有一个固定的计划运行,该运行为每个数据库执行例程,为此,我们使用“对每个输入行执行”类型的JOB。 enter image description here

答案 1 :(得分:1)

使用参数!

定义连接时,在S输入框的右侧会看到一个小的Database Name蓝色菱形标志。这意味着您可以输入参数来代替拼写数据库的名称。

第一次使用时,会遇到一些挑战。因此,即使您很想直接启动./kitchen.sh来读取每个客户包含一行的文件,也要按照该步骤进行操作。

1)参数化您的转换。 右键单击任意位置,选择Properties,然后选择Parameters,填写表格:

  • 行1:Col1(参数)= HOST_NAME,Col2(默认值)= Cust1的主机名
  • Row2:Col1 =数据库名称,Col2 = Cust1的数据库名称
  • 第3行:Col1 = PORT_NUMBER,Col2 = Cust1的数据库名称
  • 第4行:Col1 = USER_NAME,Col2 = Cust1的数据库名称
  • 行5:Col1 =密码,Col2 = Cust1的数据库名称

然后转到Database connection定义(在左侧面板中,“视图”选项卡)并在“设置”面板中:

  • 主机名:$ {HOST_NAME}-变量名,其前面带有“ $ {”,其后带有“ $”
  • 数据库名称:$ {DATABASE_NAME}-不要键入名称,请按Crtl + SPACE
  • 端口号:$ {PORT_NUMBER}
  • 数据库名称:$ {USER_NAME}
  • 数据库名称:$ {PASSWORD}

测试连接。如果有效,请尝试运行。

2。检查参数。 当您按下run按钮时,Spoon会提示您输入一些Run option(如果您过去勾选了“不再显示我了”,请使用{{1}附近的下拉菜单}。

更改Cust2的参数值。并检查是否为其他客户运行。

Run menu列和Value列上进行更改。您很快就会了解其中的区别,目前检查一下两者是否都可以。

3。在命令行中检查它。 使用command line中的pan。
语法应类似于:

Default value

这时,您会经历一些试验和错误,因为./pan.sh -file=your_transfo.ktr -param=HOST_NAME:cust3_host -param=DATABASE_NAME:cust3_db....=之间的语法会随OS和PDI版本的不同而明显变化。但是您应该通过4-6次试验来解决问题。

4。找工作 对于PDI的并行计算范例,您不能在单个转换中使用:步骤。您需要进行两个转换:第一个转换读取csv文件,并通过Set variable步骤定义变量。第二个是您刚刚开发和测试的转换。

不要期望它会在第一次试用时运行。 PDI的某些版本存在错误,例如,需要清除转换中参数的默认值。 Set variable步骤将为您提供帮助,该步骤将在调用作业的日志中写入一个字段。当然,您需要首先通过Write to log步骤将参数/变量放在字段中。

尤其不要从完整的客户列表开始!之前,请先设置2-3个客户的系统。

在您的csv中写入完整的客户列表,然后运行。

在最终加载时选择一个SELECT COUNT(客户)。这很重要,因为您可能希望加载尽可能多的客户,以便即使出现故障也要继续执行此过程。这是默认行为(在我的最佳记忆中),因此,如果有大量客户,您可能不会在日志中注意到失败。

5。安装作业

原则上,它只是一个Get variable

但是,如果要自动执行负载,将很难检查是否出了问题。因此,请使用./kitchen.sh步骤的System date (fixed)打开转换,并将结果与​​客户数据一起写入。或者,您可以在主要工作中获得该日期,并将其与其他变量一起传递。

如果您担心在数据库中创建新列,请将按天加载的客户列表存储在另一个表中的文件中,或者通过邮件发送给您。根据我的经验,这是能够回答声称最大客户不在几周前加载树的用户的唯一实用方法。