外部表两种文本格式载入数据的测试

一.前言

  使用SinoDB外部表external table可以实现数据的快速导入和导出,提供标准的并发操作,可支持多线程,在某些场景可以避免长事务,性能优异。以下主要对外部表的两种文本格式载入数据进行简单对比测试:
  分隔符(delimited)和固定长度(fixed)两种文本格式。

二.分隔符(delimited)

使用分隔符(delimited)格式文件格式简单说明:

1.导出的每一列的值以ASCII码作为分隔符,比如“ctrl+F”作为间隔符合在ASCII码表示为006;
2.分隔符在每一列值的右边,行尾以分隔符结尾;
3.如果字符类型中含有换行或回车字符,不需要特殊字符替换和其它预处理,只需要在此处先输出符号\,再折行输出其它数据,如有多个折行,按此方法输出,这样一行记录可能拆分成多行输出;
4.分隔符“|”,折行以”\”为转义。

文本testesc.unl内容如下:

假设已有实体表FO_TODOAPPROVE3,然后用SAME AS的方式载入文本数据到外部表TODOAPPROVE3:

drop table if exists FO_TODOAPPROVE3;

CREATE EXTERNAL TABLE FO_TODOAPPROVE3 SAMEAS TODOAPPROVE3
USING (DATAFILES(“DISK:/home/informix/suyg/extab/testesc.unl”),
FORMAT ‘DELIMITED’, DELIMITER ‘|’,
ESCAPE ON,
MAXERRORS 100,
REJECTFILE “/home/informix/suyg/extab/reject_test.out.delmt”);

数据载入到对应外部表后,显示共有3条数据,如下:

image

以上测试说明外部表以分隔符格式的可以成功导入带有换行符或折行的文本数据。

优点:
当需要导入的文本字符中含有换行符号的时候,分隔符格式的文本文件可以用转义符”\”加在折行处,而不需要额外处理含有换行符的文本内容带来的转换和二次清洗,这种便利性对于数据量比较大及某些应用场景来说非常有用。

缺点:
分隔符虽然可以自定义,但也是特殊字符中的其中一种,有可能和数据中的内容冲突。好在,创建外部表的时候,数据库系统会选择忽略错误的行,而只导入符合格式的数据到外部表(REJECTFILE文件记录了异常数据的情况)。这样,只要考虑追加异常部分的数据补全即可。

三.定长(fixed)

定长文件格式说明及要求:

1.每一列导出按固定长度,不足部分在值右边以空格补齐;
2.NULL也以空格补齐长度;
3.列和列之间不需要分隔符;
4.行与行之间首尾相接一一对应;
5.如果字符类型中含有换行字符,则按换行内容自然导出,但换行符占用一个字节长度。

下面以一个定长格式的文本文件为例说明:

说明:虽然显示有3行数据,但每一条数据行尾和下一条数据行首相连,没有以任何字符为分割界定,因此无法直观判断到底有多少条数据;另外,标记回车符处为数据本身内容,且占用数据定义长度的一个字节。

根据字段类型和定长长度,创建一张外部表,将以上文本文件导入:

CREATE EXTERNAL TABLE et_tt_user
(
seqid bigint external char(10),
isdone integer external char(4),
user varchar(100,0) external char(10),
crtime datetime year to second external char(19)
)
USING (DATAFILES(“DISK:/home/informix/suyg/extab/t_user_loc_data.unl”),
FORMAT ‘FIXED’,
MAXERRORS 100,
REJECTFILE “/home/informix/suyg/extab/reject_fixed.out.0702”);

注意:以定长格式载入文本文件数据载入创建外部表时,需要指定外部文件的数据类型、长度以及映射到实体表的关系。

导入到表后显示的结果如下:

以上,显示共载入6条数据。

优点:
定长格式的数据不需要任何分隔符,因此可以避免分隔符自身与数据内容冲突的可能性。

缺点:
定义外部表语句时需要手工匹配定义数据文件和实体表数据类型及长度,带来额外的工作量;由于内容长度不足部分由空格补齐,往往需要考虑处理数据入库之后,空格带来的大量存储空间被占用问题,这需要由数据库管理员对表进行二次清洗,工作量和难度可想而知。此外,如果文本字符中含有换行符,就要考虑最初导出这些数据时其占用一个字节长度引发的问题。

四.两种格式对比

  以上测试,看出两种格式的文本文件都有其优缺点,都有其适用的应用场景和数据特点。一般情况下使用分隔符格式文本载入外部表的方式可适用场景较多,是外部表导入数据优先选择的文本格式。

  虽然现在有不少第三方工具和开源工具都能很好的支持异构数据库到SinoDB数据的迁移,但在不少工作和客户环境下,外部表工具依旧是值得信赖的数据迁移帮手。