Datastage的使用心得及unix应用

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 中实现,而应该放到外部程序中,以 sql code 的形式完成,以保证整个程序的稳定性,安全性。
 
 
上面是一些大方向的问题,在实际中会有很多烦琐的小问题,我也尽量的列举一些:
1 .字符集: output input 中的字符集都设置为 none, 是一个不错的选择。至少可以保证程序运行不会因为乱码 abort
2 .文本中的列分隔符无法设置为三位,从理论上讲,只有三位分割符才可以保证程序不会将乱码辨认为分隔符,这是 Datastage 的一个缺陷。
3 .在使用自定义 sql 前,需要使用非自定义形式手工配置好所需要的表,然后再切回自定义格式,如果直接写自定义 sql, 将导致 Datastage 无法辨别表名,从而导致错误,这应该是一个 bug
4 .保持配置一个 input output ,就 view data 一下的习惯,不要等到 run 时再回头找 error.
5 Input 中尽量不要使用 insert or update 之类的选项,它和 insert only 的差别是巨大的。使用 insert or update 等选项,相当于使用游标,逐条进行对比,每 insert 一条,都要先做一次全表扫描,其速度是可想而知的。如果必须要实现这种功能,应使用其他方法,如先 delete 目标表中所有与源表重复的记录,然后再从源表中 insert 数据 .
6 Date 型数据是比较麻烦的,因为 Datastage 中的日期格式为 timestamp, 当然你也可以把它的日期格式更改为 date 型,但经常会出现错误。对于 oracle 数据库源表和目标表,不需要对 date 型数据做任何转换,直接使用默认即可,但对于 informix 等一些数据库,则需要使用 oconv iconv 函数进行转换,并在 output 中相应的修改 output sql 中的日期格式。具体用法可以去网上或查 datastage 帮助。
7 .只要你保证 input output 时数据类型和长度不会有问题,在两者之间的这一段过程中, Datastage 中的数据类型和长度是可以随意更改的,也可以随意增加自定义列。
8 .字符串中的半角空格需要用 trimb, 而不是 trim 函数,但这点往往被忽略。其他的情况还可能有半角中文等,所以字符串,长度,字符集,这几者之间经常会导致 Datastage 产生错误,所以应尽量保证 insert 前的字符串长度要小于 insert 后的字符串长度,而你看到的 insert 前的字符串长度并不一定就是它在 Datastage 中真正的长度,所以使用 trimb 函数在 input sql 中做一下限制,才是最稳妥的方法。
 
 
最后说一个 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,getstatus controljob,job
其中只给大家列出 controljob,getstatus controljob ,以及 shell 中的 controljob 调度命令,其他的部分就不再详述了
 
一、普通的control job
1.带斜线、下划线并加粗 的部分需要考虑是否是并行的,如果是并行的就不需要这句
2.原始层需要加进蓝色的行
3.红色的表示job的名字,用来替换job的名字
[b1]该行对应原始层的job,当需要从文本 load数据 时,需要在这里调用相应的sh 
* Setup DXrtInc, run it, wait for it to finish, and test for success
      hJobDXrtInc1 = DSAttachJob("DXrtInc", DSJ.ERRFATAL)
      If NOT(hJobDXrtInc1) Then
         Call DSLogFatal("Job Attach Failed: DXrtInc", "JobControl")
         Abort
      End
     
      Call DSExecute("UNIX", "/essbase/script/dwcorp/system/t [b1]  .sh", Output, SystemReturnCode)
    
    *If FAIL Then RESET
      Status = DSGetJobInfo(hJobDXrtInc1, DSJ.JOBSTATUS)                                                                   
      If Status = DSJS.RUNFAILED Then
         ErrCode = DSRunJob(hJobDXrtInc1, DS
阅读全文(781) | 回复(2) | 引用通告(0) | 编辑

回复:Datastage的使用心得及unix应用
matata发表评论于2005-12-7 10:59:08

larry,第一个问题其实并不是ds的问题吧。ds其实就是一个sql载体。当然ds也可以做一些调优。但主要还是在数据库端做好index,patition.第二个就我所知,hash是为了加快join的速度,把一些表扔到hash文件里。具体我也不是太清楚了

个人主页 | 引用 | 返回 | 删除 | 回复

回复:Datastage的使用心得及unix应用
larry-sword发表评论于2005-12-1 10:40:59

tata兄弟在使用DataState的时候,不知道有没这样的疑问。
1、在DataStage 中如果需要去关联一个非常大的表时(如几千万的客户信息表),如何处理才能保证性能最佳?
2、DataStage 的Hash表的设计在具体实施中的意义。 Hash 表最终是向硬盘写入数据 生成HASH文件 那么实际hash table与内存之间的关系又是什么?在使用DataStage工具时 如何来理解 Hash文件的设计在其中的真正意义。和其引申出来的ETL设计的理念?
希望tata不吝赐教!大家一块儿来讨论

个人主页 | 引用 | 返回 | 删除 | 回复
 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值