DATASTAGEDATASTAGE经验积累.docx

上传人:b****4 文档编号:4817661 上传时间:2023-05-07 格式:DOCX 页数:28 大小:63.03KB
下载 相关 举报
DATASTAGEDATASTAGE经验积累.docx_第1页
第1页 / 共28页
DATASTAGEDATASTAGE经验积累.docx_第2页
第2页 / 共28页
DATASTAGEDATASTAGE经验积累.docx_第3页
第3页 / 共28页
DATASTAGEDATASTAGE经验积累.docx_第4页
第4页 / 共28页
DATASTAGEDATASTAGE经验积累.docx_第5页
第5页 / 共28页
DATASTAGEDATASTAGE经验积累.docx_第6页
第6页 / 共28页
DATASTAGEDATASTAGE经验积累.docx_第7页
第7页 / 共28页
DATASTAGEDATASTAGE经验积累.docx_第8页
第8页 / 共28页
DATASTAGEDATASTAGE经验积累.docx_第9页
第9页 / 共28页
DATASTAGEDATASTAGE经验积累.docx_第10页
第10页 / 共28页
DATASTAGEDATASTAGE经验积累.docx_第11页
第11页 / 共28页
DATASTAGEDATASTAGE经验积累.docx_第12页
第12页 / 共28页
DATASTAGEDATASTAGE经验积累.docx_第13页
第13页 / 共28页
DATASTAGEDATASTAGE经验积累.docx_第14页
第14页 / 共28页
DATASTAGEDATASTAGE经验积累.docx_第15页
第15页 / 共28页
DATASTAGEDATASTAGE经验积累.docx_第16页
第16页 / 共28页
DATASTAGEDATASTAGE经验积累.docx_第17页
第17页 / 共28页
DATASTAGEDATASTAGE经验积累.docx_第18页
第18页 / 共28页
DATASTAGEDATASTAGE经验积累.docx_第19页
第19页 / 共28页
DATASTAGEDATASTAGE经验积累.docx_第20页
第20页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

DATASTAGEDATASTAGE经验积累.docx

《DATASTAGEDATASTAGE经验积累.docx》由会员分享,可在线阅读,更多相关《DATASTAGEDATASTAGE经验积累.docx(28页珍藏版)》请在冰点文库上搜索。

DATASTAGEDATASTAGE经验积累.docx

DATASTAGEDATASTAGE经验积累

DATASTAGE——一DATASTAGE经验积累

一、JOB的分类与作用

    1、ServerJOB:

     最为常用的Job类型,Job可以组合使用,ServerJob是Job的最小单位。

     原文档:

IfyouhavetheWebServicespackinstalledanadditionalcheckbox,WebServiceEnabled,appears.Selectittoindicatethejobcanbemadeavailableasawebservice.

    2、ParallelJOB:

    3、MainframeJOB:

运行于大型机的JOB。

  4、JOBSequences:

JobSequence主要用于Job间的协作工作控制,如各Job的实行流程,出错处理,文件监控等。

二、jobstatus的用法      

jobstatus

-jobstatuswaitsforthejobtocomplete,thenreturnsanexitcodederivedfromthejobstatus.

命令格式为:

       dsjob–run

       [–mode[NORMAL|RESET|VALIDATE]]

       [–paramname=value]

       [–warnn]

       [–rowsn]

       [–wait]

       [–stop]

       [–jobstatus]

       [–userstatus]

       [-local]

       projectjob

三、判断NULL值

  实例

       STAGE:

JOINSTAGE

       设置:

        LEFTJOIN

        左输入语句:

SELECT*FROMPMP_Insured_Amount

        右输入语句:

SELECTCOL_ID,TAB_NAME,WORK_DATE,

REF_COLUMN1ASUNIQUE_ID_IN_SRC_SYS,

REF_COLUMN2,ROW_ID,

HASHCODEASB_HASHCODE,

ANCHOR_ID,PARTITION_KEY,

IS_DUPLICATED,

'A'ASMARK              --用以判断结果集右边是否为空

FROMETL_FOR_INC_TMP2

SQL语句:

  SELECTA.*,B.*

  FROMPMP_Insured_AmountA

LEFTJOINETL_FRO_INC_TMP2B

ONA.UNIQUE_ID_IN_SRC_SYS=B.UNIQUE_ID_IN_SRC_SYS

功能:

判断来自A表的所有记录,哪些能够B表关联,哪些不能与B表关联。

说明:

由于在构造右输入语句时增加了一个B表中没有的常量字段MARK,所以如果A表能够与B表关联的记录,该常量字段就不为空值(此处设了该常量值为A);如果A表与B表关联不上的记录,该常量字段就为空值(NULL)。

如此只需用一条判断语句判断常量字段是否为空,从而分出两种记录来。

       

记录分离所使用的STAGE是Transformstage。

一开始时,使用Condition设置了字段MARK='A'与字段MARK<>'A'来分离记录,运行后发现只有MARK='A'的一支有数据通过,而MARK<>'A'的一支没有数据通过,后来把MARK<>'A'的一支的条件(condition)改为ISNULL(MARK)后,数据正常输出。

总结:

从理论上说,任何与NULL值作比较运算(=、>、<、<>)结果都为NULL,而MARK<>'A'属于比较运算,当MARK为NULL时,结果就为NULL,所以就会没有数据输出。

实际上,在MSSQLSERVER2000中,如果使用WHEREMARK<>'A'作筛选条件,是可以把为NULL值的字段输出的。

这是DATASTAGE与MSSQLSERVER在处理NULL值运算的不同,MSSQLSERVER是允许一定违反规范规则的情况存在。

四、关于对多表进行关联操作的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完成上述取值规则的语句:

       SELECTA.a,A.b,A.c,A.d,B.e

        FROMALEFTJOIN

               (SELECTA.a,A.b,A.c,A.d,B.e,AB.e

               FROMALEFTJOINBONA.b=B.b)ASABONA.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的设置细节。

例子:

 在用JOINSTAGE对两张表进行关联,关联的条件是UID,再设置的该STAGE对数据按照UID进行HASH分区,所有的STAGE都设置正确无误后,运行JOB,老是在JOINSTAGE里有一个WARNING。

原因:

 这种情况是由于设置HASH分区后产生的(数据分区的概念将另述)

 解决方法:

 打开产生WARNING的STAGE的前一个(是前一个!

)也进行了HASH分区的STAGE的设置面板,在StagePage——AdvanceTab里,选择Preservepartitioning下拉选项中的“Clear”值。

默认是“Propagate”值,其意义是下一个STAGE在做HASH分区时,会继承上一个(即该STAGE)对HASH分区的设置参数。

按照HASH分区的机制,这样继承会出现数据丢失的可能,所以DS就会产生WARNING。

而选择“Clear”的意义就时让下一个要做HASH分区的STAGE不要继承上一个STAGE的HASH分区设置,而重新按照用户的设置来进行HASH分去。

六、把结果输出到平面文件时的注意事项。

    例子:

在原来调试过正确无误的JOB,把最后的数据文件由原来的DATASET改为SEQUENCE文件时,JOB运行正常,且可以重运行,就上没有实际的数据输入到结果文件里,文件所对应的输入LINK显示有数据输入,结果文件也创建了,但打开的是一个空白文件,VIEW也VIEW不到有数据,提示说没有结果返回。

   原因:

平面文件的默认格式设置引起。

默认下,平面文件的输入格式是,每个字段都要有值输入。

如果输入到平面文件的数据中有空值,而平面文件又用默认设置的话,输入就会给REJECT掉。

  解决方法:

设置平面文件的数据格式。

在StagePage——Format里,设置空值的处理方式,比如设为NULL,则遇到空值时,DS就会在平面文件的该字段里填充NULL。

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

八、对于那些关联不上而又为非空的字段,DS会自动赋默认值,数字型默认值为0,字符型默认值为''。

       例子:

       表A通过JOINSTAGE与表B进行左关联,取B表的流水ID,B表的ID字段可空性为NO,把B表的ID传递给A表,然后通过TRANSFORMSTAGE设置条件取出关联不上的记录来,TRANSFORMSTAGE的过滤条件是:

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。

相应的,TRANSFORMSTAGE的过滤条件就应该改为ID=0或ID='',即可把关联不上的记录正常输出来。

       方法二:

直接修改TRANSFORMSTAGE的过滤条件,修改为:

NullToZero(ID)=0或者NullToEmpty(ID)=''。

       注意:

经过DS赋予默认值后,ID其实已经不为NULL了,所以理论上使用NullToZero或NullToEmpty是不适合的。

但实际开发中,上述方法确实能够解决问题。

九、可空字段拼接字符串特别需要注意的问题:

在拼接字段串时,要注意所以拼接的字段当中有没有空字段,如果有,一定要用NullToZero或者NullToEmpty函数对该字段进行封装。

如果不是经过函数封装处理,如果碰到某条记录,它用来拼接的字段是NULL,那么这条记录就会给过滤掉,从而影响了结果。

       由于拼接字符串一般都是几个到十几二十个字段,有时候容易令人忽略这个问题,常常发现本来应该可以从TRANSFORMSTAGE输出的数据却给REJECT掉,就要注意是否存在可空字段拼接字符串,而且数据当中的确存在一些记录,里面用于拼接的字段是NULL的情况了。

十、使用TRANSFORMSTAGE进行条件判断过滤数据,一般用于判断的字段是Nullable;

使用FILTERSTAGE来过滤数据,一般用于判断的字段是No-Nullable。

 

DataStage官方文档学习笔记

1.通过右键添加link

鼠标右键点击起始stage,按住右键移动鼠标到目标stage。

还有一种方法就是把鼠标放在起始stage的边缘等到变为一个小圆圈里面有一个叉的时候拖动鼠标到目标stage。

2.DataStage中默认和隐式类型转换时注意的问题

当从源向目标映射数据时,如果类型不一致,对于有些类型我们需要在modify或transfomerstage中通过函数进行转换,对于有些系统会自动完成类型转换,在类型转换过程中,注意以下几点:

1在变长到固定长度字符串的默认转换中,paralleljobs用null(ASCII0)字符来填充剩余长度。

联系到前面做的一个paralleljob,当目标是变长时(当时源也是变长,但是好像源的精度要小些),但是字符串实际的长度没有指定的变长那么长的话,系统会自动用空格(ASCII20)来填充(具体在哪个stage填充的不知),而且环境变量APT_STRING_PADCHAR的默认值也是空格(ASCII20)。

2通过环境变量APT_STRING_PADCHAR可以改变默认的填充字符null(ASCII0)。

注:

联系上面两点,感觉文档讲的与实际不符,难道我们项目的administrator改变了该环境变量的默认值?

3有个PadString函数可以用来用指定的字符来填充一个变长的字符串到指定的长度。

这个函数的参数不能使固定长度字符串,如果是固定长度的先转化为变长。

3.CopyStage作为占位符

在job开发中,当你暂时不知道该使用哪个stage时,可以使用copystage作为占位符,注意不要把Force属性设为True,在不把Force设为True时,复制将在运行时进行优化。

使用Schemafile来指定metadata

1可以通过列定义和schemafile两种方式来指定metadata,值得注意的一点是Notethat,ifyouuseaschemafile,youshouldensurethatruntimecolumnpropagationisturnedon.Otherwisethecolumndefinitionsspecifiedinthestageeditorwillalwaysoverrideanyschemafile.即,如果想通过schemafile来指定metadata,必须勾上runtimecolumnpropagation,否则总是使用列定义来作为metadata。

2IfyouareusingaschemafileonanNLSsystem,theschemafileneedstobeinUTF-8format.如果你的datastage使用了NLSsystem,那么schemafile必须是UTF-8格式的。

文档中说可以使用Sequentialstage来完成转码。

 

通过ServerSharedContainer在ParallelJob中添加ServerJobStage

YoucreateanewsharedcontainerintheDataStageDesigner,addServerjobstagesasrequired,andthenaddtheServerSharedContainertoyourParalleljobandconnectittotheParallelstages.在Designer中创建一个serversharedcontainer,添加需要的Serverjobstage,再把serversharedcontainer添加到paralleljob并连接到其他parallelstage。

 

几个环境变量的具体路径

%SERVERENGINE%–DataStageengineaccountdirectory(normally

C:

\Ascential\DataStage\EngineonWindowsand

\Ascential\DataStage\DSEngineonUNIX).

%PROJECT%–Currentprojectdirectory.

%SYSTEM%–SystemdirectoryonWindowsNTor/usr/libonUNIX.

一句不太懂的话,先做记录

IfNLSisenabled,avoidusingthebuilt-inIconvandOconvfunctionstomapdataunlessyoufullyunderstandtheconsequencesofyouractions.在使用了NLS时,尽量避免使用IconvandOconv来映射日期,因为可能产生一些意想不到的结果。

4.Datastage的使用心得及unix应用

Datastage是Ascential公司出品的著名第三方ETL工具。

它的主要特点有:

1.可视化操作截面,避免了大量的手工code

2.第三方工具,善于处理复杂的数据源

3.可监控性好,能够快速发现ETL中的问题并解决

  

对于Datastage的初学者来说,通过学习官方培训资料(网上到处都有的当了),可以快速的入门,毕竟Datastage是一个可视化的工具,没有太深涩难懂的内容。

但在真正运用中,就可能碰到各种各样的问题。

下面就说一说我在使用中曾经困惑过的一些问题:

1.Job的粒度。

一套ETL过程中,含有多个步骤,在设计过程中,到底是粗化一些,用少而复杂的job实现,还是细化一些,用多而简单的job实现更好呢?

我个人认为,比较细的粒度更有利于程序的开发。

在开发初期,表面看来细化的job比较繁琐,但在项目后期的测试阶段,细化的job可以更准确的定位错误并易于修改。

2.并行和串行。

当到了开发后期,我们准备把多个job连接起来,我们就会发现,能否将多个job并行成为ETL效率的关键,而这个因素在设计初期往往被忽略。

ETL中可能会涉及多个数据源的多个表,而多个job也可能会形成对某个数据源以及其中的某个表的争用。

当数据源争用时,会影响ETL的执行效率。

当表争用无法解决的时候,就只能使用串行。

而一个好的结构流程设计,可以极大的减少这种争用,从而提高ETL的效率。

3.要将Datastage与外部code相结合。

Datastage并不是独立运行的开发工具,它需要外部控制程序为载体,才可以进行良好的客户操作。

而Datastage也不是万能的,简单的说,它只是sql语言的一个可视化载体。

因此,有一些功能,并不一定要在Datastage中实现,而应该放到外部程序中,以sqlcode的形式完成,以保证整个程序的稳定性,安全性。

 

 

上面是一些大方向的问题,在实际中会有很多烦琐的小问题,我也尽量的列举一些:

1.字符集:

output和input中的字符集都设置为none,是一个不错的选择。

至少可以保证程序运行不会因为乱码abort。

2.文本中的列分隔符无法设置为三位,从理论上讲,只有三位分割符才可以保证程序不会将乱码辨认为分隔符,这是Datastage的一个缺陷。

3.在使用自定义sql前,需要使用非自定义形式手工配置好所需要的表,然后再切回自定义格式,如果直接写自定义sql,将导致Datastage无法辨别表名,从而导致错误,这应该是一个bug。

4.保持配置一个input或output,就viewdata一下的习惯,不要等到run时再回头找error.

5.Input中尽量不要使用insertorupdate之类的选项,它和insertonly的差别是巨大的。

使用insertorupdate等选项,相当于使用游标,逐条进行对比,每insert一条,都要先做一次全表扫描,其速度是可想而知的。

如果必须要实现这种功能,应使用其他方法,如先delete目标表中所有与源表重复的记录,然后再从源表中insert数据.

6.Date型数据是比较麻烦的,因为Datastage中的日期格式为timestamp,当然你也可以把它的日期格式更改为date型,但经常会出现错误。

对于oracle数据库源表和目标表,不需要对date型数据做任何转换,直接使用默认即可,但对于informix等一些数据库,则需要使用oconv,iconv函数进行转换,并在output中相应的修改outputsql中的日期格式。

具体用法可以去网上或查datastage帮助。

7.只要你保证input和output时数据类型和长度不会有问题,在两者之间的这一段过程中,Datastage中的数据类型和长度是可以随意更改的,也可以随意增加自定义列。

8.字符串中的半角空格需要用trimb,而不是trim函数,但这点往往被忽略。

其他的情况还可能有半角中文等,所以字符串,长度,字符集,这几者之间经常会导致Datastage产生错误,所以应尽量保证insert前的字符串长度要小于insert后的字符串长度,而你看到的insert前的字符串长度并不一定就是它在Datastage中真正的长度,所以使用trimb函数在inputsql中做一下限制,才是最稳妥的方法。

 

 

最后说一个datastage在unix中应用的实例,以供大家参考:

一个完整的ETL,其步骤是:

1.业务用户接口(java,jsp等友好界面)触发

2.Shell运行

3.启动Controljob运行

4.Controljob启动job

5.监控job状态的Controljob运行(循环运行,直到所有job结束)

6.返回job执行情况到shell

7.Shell返回执行情况到业务接口

8.用户得到结果

 

可以看出,这里包括了几个主要元素:

业务接口,shell,controljob,getstatuscontroljob,job

其中只给大家列出controljob,getstatuscontroljob,以及shell中的controljob调度命令,其他的部分就不再详述了

 

一、普通的controljob

1.带斜线、下划线并加粗的部分需要考虑是否是并行的,如果是并行的就不需要这句

2.原始层需要加进蓝色的行

3.红色的表示job的名字,用来替换job的名字

该行对应原始层的job,当需要从文本load数据时,需要在这里调用相应的sh 

*SetupDXrtInc,runit,waitforittofinish,andtestforsuccess

hJobDXrtInc1=DSAttachJob("DXrtInc",DSJ.ERRFATAL)

IfNOT(hJobDXrtInc1)Then

CallDSLogFatal("JobAttachFailed:

DXrtInc","JobControl")

Abort

End

CallDSExecute("UNIX","/essbase/script/dwcorp/system/t.sh",Output,System

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2