datastage----datastage经验积累

上传人:第*** 文档编号:31327749 上传时间:2018-02-06 格式:DOC 页数:17 大小:170.50KB
返回 下载 相关 举报
datastage----datastage经验积累_第1页
第1页 / 共17页
datastage----datastage经验积累_第2页
第2页 / 共17页
datastage----datastage经验积累_第3页
第3页 / 共17页
datastage----datastage经验积累_第4页
第4页 / 共17页
datastage----datastage经验积累_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《datastage----datastage经验积累》由会员分享,可在线阅读,更多相关《datastage----datastage经验积累(17页珍藏版)》请在金锄头文库上搜索。

1、DATASTAGE一 DATASTAGE经验积累一、JOB 的分类与作用1、Server JOB:最为常用的 Job类型,Job 可以组合使用,Server Job 是 Job的最小单位。原文档:If you have the Web Services pack installed an additional check box, Web Service Enabled, appears. Select it to indicate the job can be made available as a web service.2、Parallel JOB:3、Mainframe JOB:运行于

2、大型机的 JOB。4、JOB Sequences:Job Sequence 主要用于 Job间的协作工作控制,如各 Job的实行流程,出错处理,文件监控等。二、jobstatus 的用法 jobstatus-jobstatus waits for the job to complete, then returns an exit code derived from the job status.命令格式为:dsjob run mode NORMAL | RESET | VALIDATE param name=value warn n rows n wait stop jobstatususer

3、status-localproject job三、判断 NULL值实例STAGE :JOIN STAGE设置:LEFT JOIN左输入语句:SELECT * FROM PMP_Insured_Amount右输入语句:SELECT COL_ID,TAB_NAME,WORK_DATE,REF_COLUMN1 AS UNIQUE_ID_IN_SRC_SYS,REF_COLUMN2,ROW_ID,HASHCODE AS B_HASHCODE,ANCHOR_ID,PARTITION_KEY,IS_DUPLICATED,A AS MARK -用以判断结果集右边是否为空FROM ETL_FOR_INC_TM

4、P2SQL语句:SELECT A.*,B.*FROM PMP_Insured_Amount A LEFT JOIN ETL_FRO_INC_TMP2 B ON A.UNIQUE_ID_IN_SRC_SYS = B.UNIQUE_ID_IN_SRC_SYS功能:判断来自 A表的所有记录,哪些能够 B表关联,哪些不能与 B表关联。说明:由于在构造右输入语句时增加了一个 B表中没有的常量字段 MARK,所以如果 A表能够与 B表关联的记录,该常量字段就不为空值(此处设了该常量值为 A);如果 A表与 B表关联不上的记录,该常量字段就为空值(NULL)。如此只需用一条判断语句判断常量字段是否为空,从而

5、分出两种记录来。记录分离所使用的 STAGE是 Transform stage。一开始时,使用 Condition设置了字段MARK = A与字段 MARK A 来分离记录,运行后发现只有 MARK = A 的一支有数据通过,而 MARK A 的一支没有数据通过,后来把 MARK A 的一支的条件(condition)改为 ISNULL(MARK) 后,数据正常输出。总结:从理论上说,任何与 NULL值作比较运算(=、)结果都为 NULL,而 MARK A 属于比较运算,当 MARK为 NULL时,结果就为 NULL,所以就会没有数据输出。实际上,在 MSSQL SERVER2000中,如果使

6、用 WHERE MARK A 作筛选条件,是可以把为 NULL 值的字段输出的。这是DATASTAGE与 MSSQL SERVER在处理 NULL 值运算的不同,MSSQL SERVER 是允许一定违反规范规则的情况存在。四、关于对多表进行关联操作的 STAGE对不同表的同名字段的处理。 手工起别名这些 STAGE有:JOIN、LOOKUP、MERGE 等。DATASTAGE的处理原则:保留前者,抛弃后者。例子:源表:A(a,b,c,d),关联表:B(b,c,e,f)。取值规则:第一次关联条件 A.b = B.b,取 B.e;第二次关联条件 A.c = B.c,取 B.e。说明:关联的有前后之

7、分的。第一次关联时,在结果集中已经存在的名字为 e的字段,第二次关联是在第一次关联的结果集的基础上进行的,第二次所取的字段名与 第一次所取的相同。在此就出现种问题,从数据库常识来说,同一张表是不允许有同名字段出现的,如何能够正确取值呢?在 T-SQL里面,可以使用 JOIN语句对表进行关联,两张表的同名字段 e因为被加了表名作前缀,所以即使字段名相同,也可以正确输出。以下则为使用 T-SQL完成上述取值规则的语句:SELECT A.a,A.b,A.c,A.d,B.eFROM A LEFT JOIN (SELECT A.a,A.b,A.c,A.d,B.e,AB.eFROM A LEFT JOIN

8、 B ON A.b = B.b) AS AB ON A.c = AB.c很容易就能看出,最终的结果将会(假设结果表名为 C):C( A.a,A.b,A.c,A.d,B.e,AB.e),结果正确,所以在 T-SQL里,在做多表关联时,可以不必关心不同表的同名字段的取值问题。但在 DATASTAGE里就不能不关心了。由于 DATASTAGE里的所有 STAGE的输出,默认下是对该STAGE的输入进行复制,即表结构的复制。输 入的是什么名字的字段,输出的也是这个名字的字段。那么多表关联时,如果不同的表有相同名字的字段,那么输出时也会出现有同名字段了,而数据表是不允许有 同名字段的,所以就会发生同名冲

9、突。DATASTAGE 对于这中其矿,处理方式是把最先输入的字段保留下来,之后如果有同字段再添加进来时,就会把要添加 进来的字段抛弃掉。这种情况,即使在 JOB运行时也不会报错的,因为语法是没有错误的,不过会出现一个 WARNING,告知用户这个 STAGE将会出现字 段知丢失。所以碰到上面上述情况,解决的方法是在第二次关联时,在输出时把这个同名字段的名字手工更改一下。如上,把字段名 e改为字段名 e_2,赋值也是 赋 e过去,这样既保留了 e的值,有不会给抛弃,只是更改了一下字段的名字,到最后输出时再统一把结果表名定制一下就行。五、对数据进行 HASH分区的 STAGE的设置细节。例子:在用

10、 JOIN STAGE对两张表进行关联,关联的条件是 UID,再设置的该 STAGE对数据按照 UID进行 HASH分区,所有的 STAGE都设置正确无误后,运行 JOB,老是在 JOIN STAGE里有一个 WARNING。原因: 这种情况是由于设置 HASH分区后产生的(数据分区的概念将另述)解决方法:打开产生 WARNING的 STAGE的前一个(是前一个!)也进行了 HASH分区的 STAGE的设置面板,在Stage PageAdvance Tab里,选择 Preserve partitioning下拉选项中的“Clear”值。默认是“Propagate”值,其意义是下一个 STAGE

11、在做 HASH分区时,会继承上一个 (即该 STAGE)对 HASH分区的设置参数。按照 HASH分区的机制,这样继承会出现数据丢失的可能,所以 DS就会产生 WARNING。而选择 “Clear”的意义就时让下一个要做 HASH分区的 STAGE不要继承上一个 STAGE的 HASH分区设置,而重新按照用户的设置来进行 HASH分去。六、把结果输出到平面文件时的注意事项。例子:在原来调试过正确无误的 JOB,把最后的数据文件由原来的 DATA SET改为 SEQUENCE文件时,JOB运行正常,且可以重运行,就上没有实际的数据输入到结果文件里,文件所对应的输入 LINK显示有数据输入,结果

12、文件也创建了,但打开的是一个空白文件,VIEW 也 VIEW不到有数据,提示说没有结果返回。原因:平面文件的默认格式设置引起。默认下,平面文件的输入格式是,每个字段都要有值输入。如果输入到平面文件的数据中有空值,而平面文件又用默认设置的话,输入就会给 REJECT掉。解决方法:设置平面文件的数据格式。在 Stage PageFormat里,设置空值的处理方式,比如设为 NULL,则遇到空值时,DS 就会在平面文件的该字段里填充 NULL。七、DATASTAGE 中 INTEGER型数值上限为 2000000000(20 亿)。八、对于那些关联不上而又为非空的字段,DS 会自动赋默认值,数字型默

13、认值为 0,字符型默认值为。例子:表 A通过 JOIN STAGE与表 B进行左关联,取 B表的流水 ID,B 表的 ID字段可空性为 NO,把 B表的 ID传递给 A表,然后通过 TRANSFORM STAGE设置条件取出关联不上的记录来,TRANSFORM STAGE 的过滤条件是:IsNull(ID),由于关联不上的记录的 ID字段会是 NULL,这样设置按理应该是可以把关联不上的记录输出的,而实际上是 输出不到的。原因:B 表 ID字段是非空的,那么传递给 A表的 ID的也将是非空。对于那些关联不上的记录,理论上 ID字段应该为 NULL,但由于 ID是非空的,所以 DS 会把一个默认

14、值插入到 ID中去。经过如此处理,使用 IsNull(ID)就当然不能数据正确记录了,因为 ID根本就不是 NULL。解决方法:方法一:在传递 ID字段给 A表时,用 NullToZero或者 NullToEmpty函数对 ID封装起来。如果 ID是数字型的,用 NullToZero, 如果 ID是字符型的,用 NullToEmpty。相应的,TRANSFORM STAGE的过滤条件就应该改为 ID = 0或 ID = ,即可把关联不上的记录正常输出来。方法二:直接修改 TRANSFORM STAGE的过滤条件,修改为:NullToZero(ID) = 0 或者NullToEmpty(ID)

15、= 。 注意:经过 DS赋予默认值后,ID 其实已经不为 NULL了,所以理论上使用 NullToZero或NullToEmpty是不适合的。但实际开发中,上述方法确实能够解决问题。九、可空字段拼接字符串特别需要注意的问题:在拼接字段串时,要注意所以拼接的字段当中有没有空字段,如果有,一定要用 NullToZero或者 NullToEmpty函数对该字段进行封装。如果不是经过函数封装处理,如果碰到某条记录,它用来拼接的字段是 NULL,那么这条记录就会给过滤掉,从 而影响了结果。由于拼接字符串一般都是几个到十几二十个字段,有时候容易令人忽略这个问题,常常发现本来应该可以从 TRANSFORM

16、STAGE输出的数据却给 REJECT掉,就要注意是否存在可空字段拼接字符串,而且数据当中的确存在一些记录,里面用于拼接的字段是 NULL的情况了。十、使用 TRANSFORM STAGE进行条件判断过滤数据,一般用于判断的字段是 Nullable;使用 FILTER STAGE来过滤数据,一般用于判断的字段是 No-Nullable。DataStage官方文档学习笔记1. 通过右键添加 link鼠标右键点击起始 stage,按住右键移动鼠标到目标 stage。还有一种方法就是把鼠标放在起始 stage的边缘等到变为一个小圆圈里面有一个叉的时候拖动鼠标到目标 stage。2. DataStage中默认和隐式类型转换时注意的问题当从源向目标映射数据时,如果类型不一致,对于有些类型我们需要在 modify或 transfomer stage中通过函数进行转换,对于有

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号