在Pentaho Data Integration中复制不同连接的作业

时间:2016-08-25 15:43:00

标签: pentaho etl kettle pentaho-spoon

我通过Spoon UI中的复制表向导生成了一个作业,它将一些表从oracle数据库源复制到SQL Server源,并对该作业进行了一些更改。

现在我想复制相同的工作(相同的表和相同的更改),但只更改连接。这可能在Spoon吗?

我查看了Spoon UI并没有找到任何可以让我通过更改连接来复制作业的选项。

修改
在我创建了两个步骤之后:一个用于生成行,另一个用于混淆密码,在encrypted字段中,我没有按预期获得'加密:Obfusctaed密码'输出

enter image description here
这是步骤生成行的样子:
enter image description here

以下是Modified Java Script Value的另一张图片:

enter image description here

4 个答案:

答案 0 :(得分:4)

您需要制作kjb文件的副本。作业和转换实际上是XML文件。然后,您可以手动编辑它。

这很简单,有<connection>个标签,所以你应该能够自己解决这个问题。

如果您希望保留两个作业而不是每次更改数据库连接凭据,我发现这是最快的方法。

如果您需要提供模糊密码(它们未加密,只是模糊处理),您可以创建一个转换,为您提供模糊信息,为您提供放入XML文件的值。

重现在Kettle 6.1中创建用于混淆密码的转换的步骤(对于旧版本,脚本值/ Mod 步骤的名称是修改的Java脚本值):< / p>

  1. 单步生成行,只需1行,将密码保存为值
  2. 步骤脚本值/ Mod 用于基本模糊处理
  3. enter image description here

答案 1 :(得分:3)

$ KETTLE_HOME / samples / transformation / job-executor中有一个例子。 将连接参数传递给子作业

糟糕的是你无法传递jdbc驱动程序名称,因此它们必须是具有不同连接设置的相同类型的数据库

enter image description here

答案 2 :(得分:2)

没有办法直接从Pentaho做你想要的,一个选择是直接改变转换的XML来改变连接。所以这个想法如下:

  1. 弄清楚连接的XML是什么样子的。为此而已 注册一个新连接,在转换中的某个地方使用它 并观察元素的XML源代码 ........
  2. 制作转换的实体副本
  3. 替换XML文件中的连接定义和引用。为此你可以像这样使用XSLT:
  4. <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    
        <!-- This template will replace the connection definition -->
        <xsl:template match="connection[./name='SOURCE_CONNECTION_NAME']">
        <!-- This is the connection configuration --> 
                <connection>
                    <name>TARGET_CONNECTION_NAME</name>
                    <server>localhost</server>
                    <type>ORACLE</type>
                    <access>Native</access>
                    <database><!-- DB NAME --> </database>
                    <port>1521</port>
                    <username><!-- USERNAME --> </username>
                    <password><!-- PWD --></password>
                    <servername/>
                    <data_tablespace><!-- --></data_tablespace>
                    <index_tablespace/>
                    <attributes>
                      <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
                      <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
                      <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
                      <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
                      <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>Y</attribute></attribute>
                      <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
                      <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
                      <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
                      <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
                    </attributes>
                </connection>
        </xsl:template>
        <!-- And that one will replace the connection's reference in table input/table output --> 
        <xsl:template match="connection[text()='SOURCE_CONNECTION_NAME']">
                <connection>TARGET_CONNECTION_NAME</connection>
        </xsl:template>
    </xsl:stylesheet>
    

答案 3 :(得分:2)

啊,我相信你可以做到这一点,但我还没有做到这一点。没必要。但我相信你可以使用共享对象来获得你想要的这种功能,并且只需要一个(更容易维护)转换。这是一个讨论它的论坛链接。

让我知道它是如何运作的。很好奇。

http://forums.pentaho.com/showthread.php?75069-Fully-Dynamic-Database-Configuration-Including-underlying-databsae-type