现在的位置: 首页 > 综合 > 正文

DATASTAGE——一DATASTAGE经验积累

2018年01月15日 ⁄ 综合 ⁄ 共 5646字 ⁄ 字号 评论关闭
 一、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:运行于大型机的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 ]
        [ –jobstatus]
        [–userstatus]
        [-local]
        project 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_TMP2
        SQL语句:
                           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)。如此只需用一条判断语句判断常量字段是否为空,从而分出两种记录来。
       
       
记录分离所使用的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中,如果使用 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。
       
说明:关联的有前后之分的。第一次关联时,在结果集中已经存在的名字为e的字段,第二次关联是在第一次关联的结果集的基础上进行的,第二次所取的字段名与
第一次所取的相同。在此就出现种问题,从数据库常识来说,同一张表是不允许有同名字段出现的,如何能够正确取值呢?
  在T-SQL里面,可以使用JOIN语句对表进行关联,两张表的同名字段e因为被加了表名作前缀,所以即使字段名相同,也可以正确输出。以下则为使用T-SQL完成上述取值规则的语句:
        SELECT A.a,A.b,A.c,A.d,B.e
        FROM A LEFT JOIN
                (SELECT A.a,A.b,A.c,A.d,B.e,AB.e
                FROM A LEFT JOIN 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的输入进行复制,即表结构的复制。输
入的是什么名字的字段,输出的也是这个名字的字段。那么多表关联时,如果不同的表有相同名字的字段,那么输出时也会出现有同名字段了,而数据表是不允许有
同名字段的,所以就会发生同名冲突。DATASTAGE对于这中其矿,处理方式是把最先输入的字段保留下来,之后如果有同字段再添加进来时,就会把要添加
进来的字段抛弃掉。这种情况,即使在JOB运行时也不会报错的,因为语法是没有错误的,不过会出现一个WARNING,告知用户这个STAGE将会出现字
段知丢失。所以碰到上面上述情况,解决的方法是在第二次关联时,在输出时把这个同名字段的名字手工更改一下。如上,把字段名e改为字段名e_2,赋值也是
赋e过去,这样既保留了e的值,有不会给抛弃,只是更改了一下字段的名字,到最后输出时再统一把结果表名定制一下就行。

五、对数据进行HASH分区的STAGE的设置细节。
        例子:
        在用JOIN STAGE对两张表进行关联,关联的条件是UID,再设置的该STAGE对数据按照UID进行HASH分区,所有的STAGE都设置正确无误后,运行JOB,老是在JOIN STAGE里有一个WARNING。
        这种情况是由于设置HASH分区后产生的(数据分区的概念将另述)
        解决方法:
       
打开产生WARNING的STAGE的前一个(是前一个!)也进行了HASH分区的STAGE的设置面板,在Stage Page——Advance
Tab里,选择Preserve
partitioning下拉选项中的“Clear”值。默认是“Propagate”值,其意义是下一个STAGE在做HASH分区时,会继承上一个
(即该STAGE)对HASH分区的设置参数。按照HASH分区的机制,这样继承会出现数据丢失的可能,所以DS就会产生WARNING。而选择
“Clear”的意义就时让下一个要做HASH分区的STAGE不要继承上一个STAGE的HASH分区设置,而重新按照用户的设置来进行HASH分去。

六、把结果输出到平面文件时的注意事项。
        例子:
       
在原来调试过正确无误的JOB,把最后的数据文件由原来的DATA
SET改为SEQUENCE文件时,JOB运行正常,且可以重运行,就上没有实际的数据输入到结果文件里,文件所对应的输入LINK显示有数据输入,结果
文件也创建了,但打开的是一个空白文件,VIEW也VIEW不到有数据,提示说没有结果返回。
        原因:
        平面文件的默认格式设置引起。默认下,平面文件的输入格式是,每个字段都要有值输入。如果输入到平面文件的数据中有空值,而平面文件又用默认设置的话,输入就会给REJECT掉。
        解决方法:
        设置平面文件的数据格式。在Stage Page——Format里,设置空值的处理方式,比如设为NULL,则遇到空值时,DS就会在平面文件的该字段里填充NULL。

七、DATASTAGE中INTEGER型数值上限为2000000000(20亿)。

八、对于那些关联不上而又为非空的字段,DS会自动赋默认值,数字型默认值为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
会把一个默认值插入到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) = ''。
        注意:经过DS赋予默认值后,ID其实已经不为NULL了,所以理论上使用NullToZero或NullToEmpty是不适合的。但实际开发中,上述方法确实能够解决问题。

九、可空字段拼接字符串特别需要注意的问题:在拼接字段串时,要注意所以拼接的字段当中有没有空字段,如果有,一定要用NullToZero或者
NullToEmpty函数对该字段进行封装。如果不是经过函数封装处理,如果碰到某条记录,它用来拼接的字段是NULL,那么这条记录就会给过滤掉,从
而影响了结果。
       
由于拼接字符串一般都是几个到十几二十个字段,有时候容易令人忽略这个问题,常常发现本来应该可以从TRANSFORM
STAGE输出的数据却给REJECT掉,就要注意是否存在可空字段拼接字符串,而且数据当中的确存在一些记录,里面用于拼接的字段是NULL的情况了。

十、使用TRANSFORM STAGE进行条件判断过滤数据,一般用于判断的字段是Nullable;使用FILTER STAGE来过滤数据,一般用于判断的字段是No-Nullable。

抱歉!评论已关闭.