【Datastage】记一次Datastage处理Oracle的Clob字段入库问题
文章目录
一、前言
作者前言:(第一篇长篇记事文本,文中可能部分描述不到位或者名词有误,欢迎大家对我指正。不喜勿喷。)
在我们使用ETL工具抽数入Oracle库时,除去我们经常使用的Char(0~2000字节)和Varchar2(1~4000字节)的字符串类型外,还有一些超出了4000字节的字符串数据存储会用到字符型大型对象(Character Large Object)–Clob。
在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了。因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种类型的字段,很灵活,适用于数据量非常大的业务领域(如图象、档案等)。
LOB类型分为BLOB和CLOB两种:BLOB即二进制大型对象(Binary Large Object),适用于存贮非文本的字节流数据(如程序、图象、影音等)。
而CLOB,即字符型大型对象(Character Large Object),则与字符集相关,适于存贮文本型的数据(如历史档案、大部头著作等)
二、Datastage处理Clob入库
以最简单的Sequential File+Transformer+Oracle Connector入库为例。
1、Sequential File部分
我所处理的数据文件间隔符为Linux的特殊字符“ESC”。
此处有一个小的知识点,如果Sequential File读取的文本文件分隔符为特殊的分隔符,那么,Datastage在设置Format->Delimiter string时利用 ASCII码 的 HEX 进行转义即可,如Linux的“ESC”做分隔符,转义值为“\1B”。其他类似。
CLOB字段值在Sequential File组件读取的时候,该字段的文本值长度可能已经大于4000个字符,也就是Datastage不能使用正常的Varchar或NVarchar存储,这里需要使用LongVarchar(Length默认最大值为2147483647)。(注:汉字时建议使用Varchar+Unicode类型)
2、Transformer部分
这一部分没什么说的,字段对应就好,有特殊处理的,可以增加转换函数等操作。具体看需求而定。
3、Oracle Connector部分
此处有一个重点,在设置Oracle Connector中的Properties时,Session->Array size必须设置值为 “1”,如图:
Columns字段选项卡中字段设置与Sequential File部分一一对应,保持一致。
4、Job Properties部分(重要)
在以上都设置OK后,此处才是重点。
这里主要是Parameters设置中,有两个参数格外注意:APT_MAX_DELIMITED_READ_SIZE和APT_DEFAULT_TRANSPORT_BLOCK_SIZE这两个参数。
APT_MAX_DELIMITED_READ_SIZE
APT_MAX_DELIMITED_READ_SIZE 类型string,默认值为100000,如果字符长度超出,会出现如下报错:
Sequential_File_0,0: Error reading on import.
Sequential_File_0,0: Consumed more than 100,000 bytes looking for record delimiter; aborting
分析该数据,字段分割符和记录分割符都设置正确,比较异常的是文件中存在长度较大的记录(如长度为40241)。
问题解决:
Datastage Administrator客户端中,在User Defined目录下增加环境变量名:
然后打开出现本问题的作业,在作业参数中引入该环境变量,设置值为合适的值,如本例中设置为2048000。
APT_DEFAULT_TRANSPORT_BLOCK_SIZE
该环境变量为系统环境变量,默认一般为131072,如果该Block空间不足,会出现如下报错:
Fatal Error: Virtual data set.; output of “APT_OraReadOperator in ORA_clpm_approval_comment”: the record is too big to fit in a block; the length requested is: 224552.
问题解决:
说明ORA_clpm_approval_comment这个stage的输出link,记录长度过大,block空间不够。
在该作业中导入系统环境变量APT_DEFAULT_TRANSPORT_BLOCK_SIZE,使该大小足够存放长度最大的记录。如本例中设置为2048000。
其中APT_MAX_DELIMITED_READ_SIZE 需要在User Defined中定义,APT_DEFAULT_TRANSPORT_BLOCK_SIZE为系统参数,添加即可。具体设置如图所示:
注:$PROJDEF变量意思是引用Administration->Environment->User Defined中设置的变量默认值。
到这里,Datastage处理Oracle的Clob类型字段的案例就设置完成,就可以执行查看效果了。
祝你成功!
文章最后分享一个“Datastage日常运维手册”的文档,非常实用哟。
DataStage日常运维手册–下载