[Logo] MyDWBI---致力于打造最专业的中文数据仓库,商务智能社区
  [Groups]首页  [Blog] 博客   [Search] 搜索   [Recent Topics] 最新主题   [Hottest Topics] 热门主题   [Hottest Download] 热门下载   [Members]  会员列表  
[Register] 会员注册 / 
[Login] 登入 
文章发表人是: killandylove
论坛首页 » 个人资料 killandylove » 文章发表人是 killandylove
发表人 内容
lianyeyu wrote:恩,那一般来说做法是怎么样呢?
自己创建日志表,把需要记录的不合理数据记录插进去么?那是不是每一个业务的需要过滤的部分都要换成router组件,合理的数据正常抽取,不合理的数据进入日志表?这样的解决办法是否合理和正确?希望指教。

另抽取程序运行失败如何去捕获?


另如在抽取的时候源表中有重复姓名的数据,而客户要求目标表中要只抽取一条最新的,这个如果处理?是事先用临时表或类似的方式处理好数据,从处理好的数据进行抽取,还是正常抽取,在PowerCenter中进行处理。如果在PowerCenter中进行处理,如何做可以解决?源表的数据量是千万级。


1.是不错的解决思路,而且在实际的工作中往往也是这样做的,因为这样可以更加方便客户追溯错误的数据,提高数据质量,不过最关键是看你判断不合理数据的逻辑,如果是很简单的逻辑,比如字段为空,字段过长,等,也可以采用informatica自带的一种捕捉不合理数据的纪录,“Reject File“

2.抽取程序如果失败,你想捕捉什么信息,如果是错误信息,可以通过session log找到。

3.如果有重复的姓名,又想找出最新的一条,首先你需要知道在源表里面有没有标示这条数据是最新的flag字段,如果没用,你只能通过时间来判断,就需要做聚合操作,建议与处理这种类型,你用临时表也好,用什么都好,然后再进行正常的抽取,千万级的数据量,也是个不小的数字,针对informatica来说,除非你们的server是超好,集群,网格计算。
exallure wrote:FATAL : (2892 | ) : (IS | PowerCenter_Integration_Service) : node01_dong : : *********** FATAL ERROR : Unexpected Condition in file [\ZeusbuilderProduction\view\powrmart\common\odl\oracle8\oradriver.cpp] line [416]. Contact Informatica Technical Support for assistance. Aborting this DTM process due to an unexpected condition. ***********

大家帮忙看看这个session log 的错误,好像比较要重,请教大家怎么解决。


高手来了,这个错误是因为你的target table 定义在repository里面和你在oracle 数据库里面不一致
,一般来说varchar2或者number类型是比较容易出现这种问题的,而且你的target table definiation一般来说是通过oracle ODBC 建的。


简单办法,你把target table或者source 的定义删除,然后再重新建一次,最好通过DataDirect Oracle ODBC driver建立defination. 然后重新跑一次,就应该解决问题了。
zdcku wrote:那没有方法能在infa中使用bigint需要的序列吗
另外怎么调用oracle的SEQ
我这只有INFA和IQ

不好意思,我看成你的数据库是oracle ,虽然我不熟悉IQ,但是我肯定IQ的SEQ肯定是能实现大数序列的,但是具体怎么实现,我不太熟悉。
lianyeyu wrote:十分谢谢回复。
问题一:
连接webservice在文档中没有找到,能就连接的方法和思路给点讲解么?或者有对应的资料介绍么?万分感谢。

问题二:
读入的源数据是根据触发器触发的表的触发标识u或i或d然后关联源表进行源表读入的,所以插入操作一条数据后要把触发器对应的表的那条数据的标识更改为已抽取,现在我怕做成两个操作会出现数据操作失败,标识更改成功的情况。所以想找一个地方能写这种操作成功后操作数据的sql,开始找到了目标的post sql,后来发现不可以,有好的建议么?

问题三:
同上。因为源表的更新或插入操作可能对应触发器表的先delete后insert,所以用rounter组件进行分发,本来按照查询顺序先delete或执行insert,可是现在主键冲突,所以怀疑informatica执行顺序可能跟查询出的顺序不一致。能把你的解决思路说的详细一下么。我接触informatica时间不长。

问题四:
这个我明白了。那如果一个workflow里的两个session,是否能控制在一个事务里,如果可以,怎么控制?


1. 没问题,坛主会上传相关资料,请留意。
2. informatica不可以做这样的操作,要做,只能写pl/sql
3. 可能刚才没有理解你的意思,如果你是针对触发器的问题,informatica很难handle.
4. 是不能的
lianyeyu wrote:1.informatica可以连接webservice么
2.单条记录执行成功有什么办法可以更改对应标识之类的,在什么地方可以设置
3.informatica数据执行的顺序跟查询源表时候的顺序是一致的么,我顺序执行delete然后insert同一条记录,出现问题,说违反唯一性主键有解决办法么?
4.informatica的事务是怎么控制的?比如session中到存储过程,可以控制到一个事务中么。


1.Sure。
2.你想更改什么对应标示???是标示这条记录插入数据库???
3.informatica数据执行的顺序和查讯表时候不一定一致,你顺序执行delete然后insert同一条语句,因为先前的删除操作根本没有提交,解决办法是两条流,一条delete,一条insert.
通过使用informatica里面的target load order里面设置先delete的数据流,在insert的数据流。或者在数据量超大的情况下,用两个session来做(不过这种操作是不符合逻辑的。。。)
4.informaitca的事物控制只能控制informatica本身的组件的事物,是不用控制到外部过程或者程序的事物的,一个session里面
所有的处理过程都在一个事物里面,出现任何fatal job问题,都会roll back.
谢谢
zdcku wrote:默认新加一个SEQ trans时
End Value Maximum value generated 为:9,233,372,036,854,775,806 bigint 19位

今天检查发现我的SEQ的End Value 全成了:2147483647 2的19次方了


很是奇怪啊
好像整个资料库中的都变了
太奇怪了
这样下去SEQ一会就溢出了

我的目标表 为Syabse IQ bigint


informatica seq组件只能处理2147483647,也就是2的19次方,在大数seq处理,建议用oracle的seq。
here2007 wrote:我在mapping 里定义了一个变量 $$DateStmp 置了 01/01/06,

建了一文本文件,把$$DateStmp 改成08/01/06
[rpstr.s_mapping_EntityInfo]
$$DateStmp = 08/01/06

然后把文件配置到WORKFLOW和session properties中,
执行后,日期还是01/01/06


首先确定你的配置文件名是不是你的session的名字,如果不是,是不能赋值的,其次如果文件名和session名相同,其次在赋值=是不用有空格的,如果有就去掉,然后在试,如果还是不行,那就是informatica公司的bug,你可以去找他们公司去领钱钱了。
accel99cn wrote:I have an initial solution, hope some one could correct and optimize the whole mapping design, especial whenit come to the optimal performance when extract data from these huge files:



1) extraction of data



Based on performance consideration, the Flat file is a huge file, I use external loader( such as SQL*LDR of Oracle) to bulk load staging DB into staging table(CUSTOMER_LoadedfromFlatFile). This script can be setup as a command task in the workflow.



2) Mapping building:



a.
Use a SQTrans to retrieve the two table in staging DB, with a SQL query Override of Union like this:



select * from

(
(

SELECT CUSTOMER_LoadedfromFlatFile.TERRITORY_ID as TERRITORYID , CUSTOMER_LoadedfromFlatFile.CUSTOMER_ID as CUSTOMERID, CUSTOMER_LoadedfromFlatFile.ACCOUNT_NUMBER as ACCOUNT_NUMBER, CUSTOMER_LoadedfromFlatFile.CUSTOMER_TYPE as CUSTOMER_TYPE,

CUSTOMER_LoadedfromFlatFile.MODIFIED_DATE as MODIFIED_DATE

FROM

CUSTOMER_LoadedfromFlatFile

)

Union

( SELECT CUSTOMER.TERRITORY_ID as TERRITORY_ID , CUSTOMER.CUSTOMER_ID as CUSTOMER_ID, CUSTOMER.ACCOUNT_NUMBER as ACCOUNT_NUMBER, CUSTOMER.CUSTOMER_TYPE as CUSTOMER_TYPE,

CUSTOMER.MODIFIED_DATE as MODIFIED_DATE

FROM

CUSTOMER

)
) order by TERRITORYID , CUSTOMERID


Settings for good query performance in the SQTrans:

Sorted inputs: 2

Create SQL commands in Pre SQL: create B-tree index on the key fields group.

Post SQL: truncate the table and drop the index for next loading.



b.
Use a Aggregator TRANS connected to the above SQTrans to remove duplicate record.
Setting: Group by key field, set aggregate function to First() or no setting of aggregate function ; check sorted input; set proper data cache and index size to 2 times of standard calculation in informatica manual if allowed.



c.
for SCD type handling of data change: Use Dynamic cached lookup


Aggregator TRANS --> lookup target table with Dynamic cache enable --> Use a filter trans to filter out unchanged rows (setting NewLookupRow != 0) --> Use Router trans to route the updated rows and new rows --> Use 2 Update strategy trans( one to update and one to insert the target table.



Key setting:

lookup: Dynamic cache enable, associated lookup target surrogate Key port with Sequence-ID;



Router_Insert_Update:

InsertGroup: NewLookupRow = 1

UpdateGroup: NewLookupRow = 2

Upd_Insert Expression: DD_INSERT

Upd_update Expression: DD_UPDATE





Session setting:



Session edit -- > Property: set Treat source row as DATA DRIVEN



Session edit -- > mapping --> Target: Check these attibutes: SELECT, Update as Update, No Select Delete.



Set partition point at SQ Trans and Agregater.



--- End of Solution ----



Is there Any one contribute to the design for the real life scenario?
Make each great day, buddies!

Ike



b和C你可以舍弃掉不考虑,因为inforamtica在数据巨大的情况下,性能会出现很大的瓶颈,因为aggregator和lookup都需要在server端load cache文件,相当于在处理之前,10g sieze的文件是会被分批做为文件load服务器,性能可想而知.
最好的办法来处理这些就是直接用SQL来做处理,分批量的处理。
把10g size的文件根据关键字段拆分成若干个文件,然后和已存在的customer表比较,当然必须有特定的关联信息,比如创建时间等等。
需要关注的问题
1.在10g size的文件里面是否有duplicate的数据
2.对于已经存在的Customer表本身数据量情况。
3.不要局限于工具本身,有的时候,能稳定,快速的解决问题就是最好的方法。
zdcku wrote:用joiner基于下面的考虑:
1、输入N条结果为M条
2、关联事实表(数据量大、经常变化、根据时间容易控制需要数据量)
3、。。。

用lookup基于下面的考虑:
1、输入N条结果为N条
2、关联维度表(数据量小、缓慢变化、一般情况需要整个表的数据)
3、。。。

大家集思广益啊


和我想法一样啊,

其实Lookup和Join在功能上还是有一定的区别的,Lookup是为了通过一个表取另外一个表所需要的数据,Join是两个表之间的关联之后的数据集。Join是可以实现Lookup的大部分功能,
其次在用法上,和楼上所述的一样,我个人理解Lookup是为了让数据流更加清晰,更加易懂,再者,它可以实现一些特殊的用法,必须像一个函数(unconnect Lookup),动态的取最新的Lookup base data(dynamic lookup),等
zdcku wrote:integration server
必须使用的
Repository server 必须至少有一个integration server 的
它是用来运行你所开发的session的


完全正确,integration server====job server 它就像一个代理,可以通过它连接数据库,运行SQL 代码,处理Job等等
Repository server就是informatica的元数据管理库,里面是informatica自身的一些定义。

原则上说这两个服务是可以分开的,只有在你需要运行Job的时候,integration server才起到作用。
dlut_chen wrote:比如在Load数据的时候,产生异常,我想插入到一张数据库表里,字段和内容我来定制,可以实现这个功能么?


你想插入的信息如果不是load的数据,是可以实现的,在workflow定义一个捕捉错误的的session,
Load data(session) successed or not
---------------------> Go to End
|No
|
Error handling session(insert contents into error table xxx)

因为这个方法是在workflow这个层面来做的,所以是不能捕捉你异常的load的数据,如果想捕捉异常的数据,informatica自带的捕错机制可以做到(参见Reject file/bad file)
dlut_chen wrote:Powercenter服务器:英文环境
Powercenter客户端: 英文环境
Source DB:日文的Sqlserver2000
Target DB: Oracle9i,支持日文

问题1. 用Desiger导出的日文表结构在设计器里面可以正常显示,但是保存到DB里是乱码。。。
问题2. 如果Source里有日文的话,倒入到Oracle里面也是乱码。如果导入到Source Sqlserver的另一张表就不是乱码。
使用UTF8或者Windows 默认的都不好用。。。。



目标的code page最好是源的超集,(MS Windows Japanese, superset of Shift-JIS)
这个是异构数据库之间的字符集问题,解决办法就是在目标数据库用源的超集
sphinxyoung wrote:大侠还是没有出现,期待ing...


最好的root用户,因为这个命令是修改系统配置的命令。不需要重启
凌云 wrote:
Ken wrote: 如果是用informatica作export的工具,估計效率上應該不是很好吧,怎么說也比不上數據庫自帶的

informatica強大的是它的T,E和L用db做吧

如果就是一種數據庫,那就在數據庫中做好了。informatica考慮的是多元化的數據源,然后用它自己的格式來統一規范。


对,就是处于这种考虑,才想用informatica 调用 DB的export,但是一直没有一个好的实现方式。
比如如何调用DB2的 export 命令?

当然,这个看你是用什么数量级的数据,你可以调用command组件,里面可以写任何的系统命令,或者你可以自己用c++或者java的自定义transformer都可以实现
zdcku wrote:
killandylove wrote:
2. 如果只实现distinct 1个字段,用sort transformer里面属性distinct


SORTER对流进该组件的所有字段都一起distinct的啊
怎么只distinct 1个字段

因为select distinct A from xxx
只有一个字段
 
论坛首页 » 个人资料 killandylove » 文章发表人是 killandylove
前往:   

网站地图 |  联系我们 |   |  招聘版主 |  免责声明 |  意见建议 |  系统帮助 | 
Copyright © 2008, mydwbi.com, All Rights Reserved | Powered by JForum 2.1.8 © JForum Team