注意点

  1. 过滤记录或者字段选择等组件,无法出现上面步骤中的字段的时候,尝试在上面步骤中再次点击确定。

  2. 两个数据流 join 前必须先进行排序操作。

  3. 数据流从计算器或 join 操作流出,并将流入另一 join 操作之前,需要插入一个字段选择插件。

  4. 表输入插件中,填写查询语句时,语句末尾不能加分号。Kettle 8.2 以上无此问题

  5. SQL 脚本插件中,填写 SQL 语句时,语句末尾必须加分号,否则不会执行。Kettle 8.2 以上无此问题

  6. 引用变量时,采用 ${变量名} 的方式引用,以免出现问题。此种引用方式还可以在变量内容后接其他字符串,例如:${key}_20151217 会被解析为:value_20151217

  7. Job 中执行多个 trans 时,如何确定 trans 执行的先后顺序?
    根据连接线的先后顺序执行,如果需要优先执行则先连接从开始到该 trans 的连线即可。

  8. 如果源数据中有空值,但是目标数据中不希望出现空值:

    • 直接设置目标数据库各列的默认值为空字符串是不行的,因为只有不对某列赋值才会填入默认值,而 NULL 是有赋值的,只是赋的是 NULL
    • 在表输入中将 NULL 值替换为空字符串也是不行的,因为 Kettle 默认在数据流传输过程中会将空字符串转换为 NULL 进行传输,因此,到了写入目标表时,传入的是 NULL 值。

    正确的解决方案:

    • 首先,在表输入中将 NULL 值替换为空字符串;
    • 其次,在 Kettle 的配置文件中配置以下内容:KETTLE_EMPTY_STRING_DIFFERS_FROM_NULL=Y
    • 配置文件位置:xxx/.kettle/kettle.properties

    这样,表输入中原来的 NULL 会被 '' 替换,而且在数据流传输中不会变回 NULL,插入目标表中即为空字符串。

    PS:Hive 中如何用空字符串替换 NULL 值?
    使用 coalesce 函数,返回列表中的第一个非空元素,如果元素都为空则返回 NULL,采用 coalesce(列名, '')

  9. 进行字段选择时,在弹出窗口的第 1、3 个标签中尽量填入所有字段,以免出现找不到字段的问题。

  10. 如果需要替换 $ 包含的变量,需要将「替换 SQL 变量」勾上。

  11. 如果使用 ? 占位符变量,需要将「从步骤输入数据」勾上,如果是多行,需要勾上「执行每一行」(可以有多个问号,会按上面的结果依次复制)。

  12. 如果下一个转换或者作业需要使用当前结果集,必须「复制记录到结果」(如果后者有命名参数需要使用上一步结果,可以不单独使用「从结果获取记录」组件,可以利用作业的「复制上一步结果到命名参数」功能)。

  13. 在作业中可以使用「检验字段的值」来判断走哪一个步骤,但是检验字段的值必须要有一个成功和一个失败。

  14. 使用循环的话可以利用作业的「执行每一行」,如果上一步还有参数结果需要向下传,记得「复制上一步结果到命名参数」。

  15. 如果当前步骤中有需要替换的参数,记得双击空白地方,将命名参数名填上。

  16. 所有带蓝色小标,里面包含一个 $ 的地方都是可以填写动态参数的。

  17. 右键组件,点击「Run next entries...」实现并行执行。

  18. SQL Group By 操作通常比在任何 ETL 环境中进行更有效。因此,PDI Group By/Memory Group By 步骤更适合无法在源进行聚合的任何数据,例如 .csv.txt 等。

问题

  1. Kettle 的集群是利用 Carte 来执行的(具体的操作可以查看这里),它只能以图形化的方式执行,无法命令行(难道每次跑任务还要人为的去操作界面?)。

  2. 还是集群,无法在作业中执行集群,只能在转换内执行。

  3. 执行循环操作太费劲了...