问题现象
在各个项目实施中,有时候会使用到yasldr工具进行csv数据的导入。关于yasldr一般的使用方法,官方文档已经有详细的介绍,具体可见: yasldr使用指导。但在涉及LOB类型的导入时,会有一些疑问,比如什么是lls模式、什么是lobfile模式等等。本文就关于如何使用yasldr导入lob类型做进一步说明,帮助大家理解。
问题的风险及影响
无风险
问题影响的版本
历史版本~23.2
问题发生原因
使用yasldr导入时,存在lob字段,往往需要多做一些处理。
33 解决方法及规避方式
不需要规避
问题分析和处理过程
背景假设
假设有一表table,表结构如下
table (C1 INT, C2 CLOB)
导入模式
三种导入方式。lls模式、lobfile模式和直接导入。
lls模式
LLS(Lob Location Specifier)模式,通过指定LLS关键词选择该导入模式。该模式选取数据文件的部分内容进行导入,且可指定从任意位置和任意长度开始导入。
指定了LLS关键字的目标表列字段映射的导入文件数据列格式需为filename.ext.nnn.mmm/:
filename.ext 为包含LOB或XMLTYPE数据的文件名称。
nnn 是文件中LOB数据的字节的偏移,仅允许为整数,且偏移量不允许超过数据文件大小且不允许为负数。
mmm 是字节中的LOB或XMLTYPE的长度,仅允许为整数。值为-1时表示null,为0时表示导入一个空LOB或空XMLTYPE,不允许将其指定为小于-1的值。
正斜杠(/)为终止字符,格式中必须包含该字符,否则报错。
--自行创建load_lls.csv文件,文件位于/home/yasdb目录下,内容假设为: 1,LOB_FILE.dat.1.2/ 2,LOB_FILE.dat.2.3/ --于该目录下创建LOB_FILE.dat文件,内容假设为: abcde --LOB_FILE.dat.1.2/ 表示 导入文件列数据为 LOB_FILE.dat.1.2/,意为从LOB_FILE.dat文件的偏移为0的位置为起始,截取长度为2的数据内容进行导入,正斜杠表示终止。 --LOB_FILE.dat.2.3/ 表示 导入文件列数据为 LOB_FILE.dat.2.3/,意为从LOB_FILE.dat文件的偏移为1的位置为起始,截取长度为3的数据内容进行导入,正斜杠表示终止。 --导入命令为: LOAD DATA OPTIONS (degree_of_parallelism=3) INFILE 'home/yasdb/load_lls.csv' INTO TABLE sqlldr_lob(c1, c2 LLS);
辅助理解:
lls导入lob的数据是需要完整放在一个.dat里的,比如:
abcde abcde abcde abcde abcdef abc a ab
在导入数据时,INFILE指的是一张表的csv数据,其中lob字段的数据通过 filename.ext.nnn.mmm/ 这样的格式来指定。比如:(以上面的示例数据为例)
"1","LOB_FILE.dat.1.5/" "2","LOB_FILE.dat.7.5/" "3","LOB_FILE.dat.13.5/" "4","LOB_FILE.dat.19.5/" "5","LOB_FILE.dat.25.6/" "6","LOB_FILE.dat.32.3/" "7","LOB_FILE.dat.36.1/" "8","LOB_FILE.dat.38.2/"
在导入时指定列为lls即可识别 c2 LLS,这里注意一个点:在计算偏移量的适合要考虑换行符的存在。
LOAD DATA OPTIONS (degree_of_parallelism=3) INFILE 'home/yasdb/load_lls.csv' INTO TABLE sqlldr_lob(c1, c2 LLS);
lobfile模式
该模式下通过引用FILLER伪列指向的LOB或XMLTYPE数据文件,将整个文件导入至目标表指定的列中
--需要导入的csv数据文件: "1","LOB0000/00000000_0001.dat" "2","LOB0000/00000000_0002.dat" "3","LOB0000/00000000_0003.dat" --00000000_0001.dat 里的一行或者一个clob类型的数据 也就是一个lob数据一个文件 aaaasa --00000000_0002.dat 里的一行或者一个clob类型的数据 bbbbb --00000000_0003.dat里的一行或者一个clob类型的数据 cccccc --导入命令 LOAD DATA INFILE 'home/yasdb/load_lls.csv' INTO TABLE sqlldr_lob(col1,file1 filler,col2 lobfile(file1) terminated BY eof);
导入命令理解
col1,file1 filler,col2 lobfile(file1)
col1是第一列的int,file1是一个伪劣的名字,filler关键字说明了这一列是伪列。col2 lobfile(file1)表明col2 列才是表中真实存在的列,其用lobfile导入。col2和file1列是一种映射关系。
辅助理解
lobfile模式就是一行lob数据就存一个.dat文件,如果有1kw行,那就是1kw个.dat文件。然后在导入的csv文件里 用代表这一行lob数据的 .dat文件来占位即可。比如:
"1","/00000000_0001.dat"
lls和lobfile区别
lls模式和lobfile模式的区别就是前者只有一个.dat文件来存放lob数据,在csv中通过偏移量的计算来指定每行需要导入的lob数据。后者就是一个lob数据就是一个.dat文件,1百万行数据那就是有1百万个.dat文件,在csv中直接在lob列指定对应的.dat类型即可。
直接导入
可以直接在csv中对应列放lob数据导入。比如:
"1","asdasdasfdfgasdasd" "2","sdasdfafgadggfg" "3","3124sasasasd" .....
限制:单个字段不超过32K
