IT Gourmet
数据仓库, ETL的笔记

软件:DataStage 8.1

Aggregator的ouput有两种,calculation和count,这两种output列都是自动转成nullable的,也就是Null属性是Yes。而数据类型会自动变成Double。不要奇怪,Count的output也是double而不是认为的integer。

因为Datastage的integer只支持到2147483647。

因为计算结果会变成nullable,因为会变成double,我们需要在后面加一个Modify或者Transformer来处理。

 

一。Null的处理

在Modify Stage中可以用newcolumn=HandleNull(OldColumn)

在Transformer中可以用NullToValue(oldcolumn)

 

二。decimal->integer的处理

一般的9及以下长度的decimal,如decimal(9,0)这样的,可以直接用modify的newcolumn:int32=int32_from_decimal(oldcolumn)

或者Transformer的AsInteger(oldcolumn)

但是由于Datastage的integer只支持到2147483647,而decimal(10,0)可能会出现3×××××××××的情况,所以系统会报range limitation的错误
。解决方法是用modify的newcolumn:int64=int64_from_decimal(oldcolumn),同时列类型改成bigint  。同理可用transformer的asinteger(这个方法本人实践时依旧报错,时间有限来不及研究原因,但是网上搜索出来这样可行)

还有一种方法,整个job都使用decimal,在目标DB connector的地方改写insert语句,用cast。

有人问cast怎么写,用sqlbuilder来生成一段sql,然后把要改的字段改成cast(colname as integer),注意这个仍然会报range limiation.本人尝试过把DB connector的fail on type mismatch, fail on length mismatch都改成No,依旧报warning并且最后会出错。本人最后的办法是改成了9,但是如果是真的一定要10,也许要cast (colname as bigint),但是这样不确定DB connector到数据库会不会mismatch了。以后有空再试吧。

奇怪的是datastage允许有integer10的类型,但是转换成integer10就会有问题。即使数据库会允许10位的integer。

 

 

posted on 2012-09-21 01:10  ImToffee  阅读(2497)  评论(0编辑  收藏  举报