ODI开发(Oracle Data Integrator)
ODI就是一个导数的工具,用IMP,EXP加个FTP和定时crontab一样可以实现导数,只不过,odi更加强大,可以实现更多的功能,等你上个项目,当你接口实现不了需求的时候,你就知道要用存储过程了,odi可以刷新执行,定时执行,不同的库数据导给同一个库用来出报表,大致如此,没有必要扣什么数据挖掘,除非售前也归你,向客户兜售ODI,才需要扯一些什么数据仓储,数据挖掘之类的。
oracle的数据加载工具,说白了,就是不同库,或不同用户下的数据传输工具。上网上下载个操作说明,先在本地安装一个ODI,熟悉熟悉操作就行了。
主要有三个工具:
1、Topology manager定义物理和逻辑架构,就是配置不同库的url,sid什么的。
2、Designer进行数据传输的操作(不同库表数据的传输,传输方式很多种(牛B之处))
3、Operator查看数据传输的结果(传输成功,还是失败,失败的原因等等)。
事实表和维表
事实表和维表多对一的关系。
比如事实表每条记录对应一次洗衣粉销售行为,其中一个字段为洗衣粉品牌代码;而维表中保存唯一的品牌和品牌代码,两表通过代码关联;这样就可以从品牌的角度对洗衣粉销售进行分析。
其实主要的区别我想是:
事实表是记录你要分析的东西;
维表是你要用来度量你要分析指标的东西;
就是说一个是对象,一个是尺度。
维度:
多维数据集的一种结构特性,是描述事实数据表中的数据的类别(级别)的有组织的层次结构。这些类别通常描述相似成员的集合,用户要根据它们进行分析。
FS表和F表是怎么产生的?
不是ODS层导过来的,是自己手动创建的。
ETL层中:(ODI相当于一个ETL工具)
ODS:直接从数据源表导入所有数据
SDE:产生FS事实表,FS表从其他表中获取数据,用视图实现
SIL:根据FS表和其他与维度相关的表产生F维表
处理完后的数据会形成 DW数据仓库
ODS层接口,主要是完成从各业务源系统到ODS的数据抽取和集成,该过程的原则是尽量保持ODS层的表结构和数据与各业务源系统的表结构和数据一致。
SDE层,是完成从ODS的数据导到数据仓库DW的表的提前步骤。从ODS的数据到DW前,都会在先加载到SDE层的临时表,然后在SIL层的时候再导入DW表。
SIL层将数据从SDE临时表里加载到DW表,其中事实表在SIL过程中,需要把对应的维度字段转换成维表生成的代理键。
(一下过程不涉及SDE和SIL)
创建主资料库->创建工作资料库(->创建源数据库和目标数据库)->创建数据服务器(在物理体系结构模块下)->创建物理方案->创建逻辑方案(可单独创建或者创建物理方案时自动创建)->创建表->创建模型->逆向工程模型->创建项目->导入知识模块->创建接口->映射、快速编辑、流(上下文Global)->执行
这其中会涉及到ODI的操作,先由设置物理层和逻辑层,物理层是和数据源的JDBC URL关联,逻辑层和物理层一一对应其命名一般都保持一致,转到模型新建模型,每个模型和一个逻辑层关联,新建反向表,反向表是不含数据的表结构,反向表弄好后转到项目,新建文件和接口,再就是在关系图中将源表和目标表映射起来,这些表需要从模型中拖来再在流中选择目标表选择 IKM SQL control append 将truncate设为是。建立好接口后执行接口将数据跑到目标表中。整个过程完成。详见10GODI\Oracle Data Integrator.doc和11GODI\浙江电子口岸BI项目_ODI操作手册.doc ODI\Oracle__Data_Integrator的使用教程.doc。
逆向工程的实质就是通过刚才建立的逻辑和物理方案连接到数据库,将源表和目标表的表结构等信息(源数据)导入到模型中。
只导入了源表的结构信息,源表数据是怎么通过执行接口就迁移到了目标数据表中呢???
源表通过逻辑架构迁移到了目标数据表中,一个模型中会有一个对应的逻辑架构
通常来说一个接口的迁移过程中,应该至少包含LKM和IKM知识模块,LKM负责将数据从源表装载至临时区域,IKM负责将数据从临时区域再整合进入目标表。
增量过滤器
>=TO_DATE('#BI_CLAIM_LAST_EXTRACT_DATE_VAR','YYYY-MM-DD')
WID
一般由对应表的序列的nextval值
ODI常见错误
1. 缺少某个字段,会提示某个字段不存在
2. LKM选择问题修改后删掉同义词,会提示数据库连接出错(ORA-02019: connection description for remotedatabase not found)
3. FULL表中TRUNCATE属性设置为是;FLOW CONTROL设置为否,否则会在delete previous出错
4. name isalready used by an existing object,删除和表名相同的同义词
5. invalidrelational operator,过滤器里面缺少条件或者符号(>=)
6. 0 : 08S01: com.microsoft.sqlserver.jdbc.SQLServerException:不支持此服务器版本。目标服务器必须是 SQL Server 2000或更高版本。原因是字段为空?
7. 2287 :42000 : java.sql.SQLException: ORA-02287: sequence number not allowed here
8. 936 :42000 : java.sql.SQLException: ORA-00936: missing expression
是因为缺少主键
9. 942 :42000 : java.sql.SQLException: ORA-00942: table or view does not exist
错误原因是创建表出错,找到建表的步骤即找到第二步,查看执行,发现错误原因如下
10. 当有很大的数据量时将下面策略设置为NONE可加快速度
11. 1747 :42000 : java.sql.SQLException: ORA-01747: invalid user.table.column,table.column, or column specification
IKM的选择问题
12. 接口执行错误
原因是开启了 FLOW_CONTROL
13. LKM SQL to Oracle 会创建临时表所以慢,DBlinkto Oracle 不创建临时表所以快。
14. 0 : 08S01 :com.microsoft.sqlserver.jdbc.SQLServerException: 通过端口 1433 连接到主机172.18.84.32 的 TCP/IP 连接失败。错误:“connect timed out。请验证连接属性。确保 SQL Server 的实例正在主机上运行,且在此端口接受 TCP/IP 连接,还要确保防火墙没有阻止到此端口的 TCP 连接。”。
原因连接SqlServer数据库出错。
15. 911 : 42000 :java.sql.SQLException: ORA-00911: invalid character
KM中多了一个分号,KM每一句不需要分号。
16. 1400 : 23000 :java.sql.SQLException: ORA-01400: cannot insert NULL into("EDW"."DW_SUPPLIER_COUNT_F"."SUPPLIER_WID")
笼统上wid不要设置成not null也可能是其他原因造成的
17. 12170 : 66000 :java.sql.SQLException: ORA-12170: TNS:Connect timeout occurred
资源被抢占了