问题现象
在各个项目实施中,有时候会使用到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数据的字节的偏移,仅允许为整数,且偏移量不允许超过数据文件大小且不允许为负数。
-
- 当输入偏移量的值为正数时,实际偏移量 = 输入值 - 1。
-
- 值为0时,实际偏移量 = 0。
-
- 值为负数时返回错误。
-
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
标签:lob,LOB,YashanDB,lls,dat,导入,FILE,yasldr From: https://www.cnblogs.com/YashanDB/p/18330358