注意点
过滤记录或者字段选择等组件,无法出现上面步骤中的字段的时候,尝试在上面步骤中再次点击确定。
两个数据流 join 前必须先进行排序操作。
数据流从计算器或 join 操作流出,并将流入另一 join 操作之前,需要插入一个字段选择插件。
表输入插件中,填写查询语句时,语句末尾不能加分号。
Kettle 8.2 以上无此问题SQL 脚本插件中,填写 SQL 语句时,语句末尾必须加分号,否则不会执行。
Kettle 8.2 以上无此问题引用变量时,采用
${变量名}的方式引用,以免出现问题。此种引用方式还可以在变量内容后接其他字符串,例如:${key}_20151217会被解析为:value_20151217。Job 中执行多个 trans 时,如何确定 trans 执行的先后顺序?
根据连接线的先后顺序执行,如果需要优先执行则先连接从开始到该 trans 的连线即可。如果源数据中有空值,但是目标数据中不希望出现空值:
- 直接设置目标数据库各列的默认值为空字符串是不行的,因为只有不对某列赋值才会填入默认值,而
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(列名, '')。- 直接设置目标数据库各列的默认值为空字符串是不行的,因为只有不对某列赋值才会填入默认值,而
进行字段选择时,在弹出窗口的第 1、3 个标签中尽量填入所有字段,以免出现找不到字段的问题。
如果需要替换
$包含的变量,需要将「替换 SQL 变量」勾上。如果使用
?占位符变量,需要将「从步骤输入数据」勾上,如果是多行,需要勾上「执行每一行」(可以有多个问号,会按上面的结果依次复制)。如果下一个转换或者作业需要使用当前结果集,必须「复制记录到结果」(如果后者有命名参数需要使用上一步结果,可以不单独使用「从结果获取记录」组件,可以利用作业的「复制上一步结果到命名参数」功能)。
在作业中可以使用「检验字段的值」来判断走哪一个步骤,但是检验字段的值必须要有一个成功和一个失败。
使用循环的话可以利用作业的「执行每一行」,如果上一步还有参数结果需要向下传,记得「复制上一步结果到命名参数」。
如果当前步骤中有需要替换的参数,记得双击空白地方,将命名参数名填上。
所有带蓝色小标,里面包含一个
$的地方都是可以填写动态参数的。右键组件,点击「Run next entries...」实现并行执行。
SQL Group By 操作通常比在任何 ETL 环境中进行更有效。因此,PDI Group By/Memory Group By 步骤更适合无法在源进行聚合的任何数据,例如
.csv、.txt等。
问题
Kettle 的集群是利用 Carte 来执行的(具体的操作可以查看这里),它只能以图形化的方式执行,无法命令行(难道每次跑任务还要人为的去操作界面?)。
还是集群,无法在作业中执行集群,只能在转换内执行。
执行循环操作太费劲了...
