写点什么

【YashanDB 知识库】如何使用 yasldr 导入 lob 类型?

作者:YashanDB
  • 2024-07-29
    广东
  • 本文字数:1906 字

    阅读完需:约 6 分钟

问题现象

在各个项目实施中,有时候会使用到 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 里的,比如:


abcdeabcdeabcdeabcdeabcdefabcaab
复制代码


在导入数据时,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

用户头像

YashanDB

关注

全自研国产新型大数据管理系统 2022-02-15 加入

还未添加个人简介

评论

发布
暂无评论
【YashanDB知识库】如何使用yasldr导入lob类型?_yashandb_YashanDB_InfoQ写作社区