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的名字
* 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
*If FAIL Then RESET
Status = DSGetJobInfo(hJobDXrtInc1, DSJ.JOBSTATUS)
If Status = DSJS.RUNFAILED Then
ErrCode = DSRunJob(hJobDXrtInc1, DS |
阅读全文(781) | 回复(2) | 引用通告(0) | 编辑 |
- 上一篇:unix下oracle手工建库过程
- 下一篇:oracle和db2存储过程实例
回复:Datastage的使用心得及unix应用 | |
larry,第一个问题其实并不是ds的问题吧。ds其实就是一个sql载体。当然ds也可以做一些调优。但主要还是在数据库端做好index,patition.第二个就我所知,hash是为了加快join的速度,把一些表扔到hash文件里。具体我也不是太清楚了
| |
个人主页 | 引用 | 返回 | 删除 | 回复 |
回复:Datastage的使用心得及unix应用 | |
tata兄弟在使用DataState的时候,不知道有没这样的疑问。
1、在DataStage 中如果需要去关联一个非常大的表时(如几千万的客户信息表),如何处理才能保证性能最佳? 2、DataStage 的Hash表的设计在具体实施中的意义。 Hash 表最终是向硬盘写入数据 生成HASH文件 那么实际hash table与内存之间的关系又是什么?在使用DataStage工具时 如何来理解 Hash文件的设计在其中的真正意义。和其引申出来的ETL设计的理念?
希望tata不吝赐教!大家一块儿来讨论
| |
个人主页 | 引用 | 返回 | 删除 | 回复 |