Infobright有个高性能的数据装载机,和标准的mysql装载机不同,infobright装载机更注重的是速度,但是支持的load语法要比mysql的要少,只支持变长文本。IEE还支持mysql装载机和insert

默认装载机(Default Loader):

ICE版本只支持infobright装载机(txt_variable)

IEE版本默认是使用mysql装载机,拥有更强大的错误处理能力。但是不会像infobright装载机那么快。通过在mysql中修改环境变量@bh_dataformat来切换不同的装载机,例如:

使用变长文本数据的infobright装载机:

mysql> set@bh_dataformat = 'txt_variable';

使用二进制数据的infobright装载机:

mysql> set@bh_dataformat = 'binary';

mysql装载机:

mysql> set@bh_dataformat = 'mysql';

infobright装载机语法(Infobright Loader Syntax):

infobright只支持下面简单语法。

LOAD DATA INFILE'/full_path/file_name'

INTO TABLEtbl_name

[FIELDS

[TERMINATED BY'char']

[ENCLOSED BY'char']

[ESCAPED BY'char']

];

数据装载完默认是自动提交的。如果想导入完检查数据后再提交,可以通过Set AUTOCOMMIT=0命令将自动提交关掉。这样的话在完成导入完需要手动支持commit提交或执行rollback命令回滚。

 

参数(FIELDS Clause

FIELDS选项是可选的,如果不指定的话默认值如下:

 

CLAUSE DEFAULTVALUE

FIELDSTERMINATED BY ';' (semicolon)

FIELDS ENCLOSEDBY '"' (double quote)

FIELDS ESCAPEDBY '' (none)

 

mysql loader不指定默认的参数为:

CLAUSE DEFAULTVALUE

FIELDSTERMINATED BY '\t'       (tab)

FIELDS ENCLOSEDBY ''    (none)

FIELDS ESCAPEDBY '\\'   (\)

 

因为默认值不同,所以不加FIELDS的情况下,直接把mysql表导出,再导入到infobright中是不成功的。还有就是FIELDS分隔符必须是一个单一的字符。Mysql loader可以为多个字符。

 

FIELDSTERMINATED BY

列分隔符可以用逗号,分号,竖线,制表符等等,但必须都是一个字符。重要的是列分隔符不会出现在真实数据中(除非设置了escaped或者enclosed

FIELDS ENCLOSEDBY

是用于将字符类型的字段用指定字符包围起来。默认是双引号。如果不想使用可以设置为NULL值。如果设置了ENCLOSED需要保证该字符没有在实际数据中出现(除非设置了escaped

 

FIELDS ESCAPEDBY

如果TERMINATED指定的列分隔符出现在真实数据里,那么它必须被ESCAPED指定的字符转义,或者被ENCLOSED设置的字符将整个字段包围起来。

举个例子:

文本里有一行数据 1,one,two or three,1234

1是一个字段,one,two or three是第二个字段,1234是第三个字段

要想把这行数据导入到数据表,要么出现在字符串里的分隔符转义,要么把包含分隔符的整个列包围起来。因为如果设置逗号为分隔符,infobright不知道onetwo之间的逗号到底是分隔符还是真实的字符

文本和load命令:

   1,one\, two or three,1234

   LOAD DATA INFILE '/usr/tmp/file1.txt' INTO TABLE test_table1 FIELDS

TERMINATED BY',' ENCLOSED BY 'NULL' ESCAPED BY '\\';

   这样的文本就可以满足要求,分隔符是逗号,而且字符串也没有设置包围的字符,onetwo之间的逗号也被加了转义,可以成功导入。

另一种方法:

   1,"one, two or three",1234

   LOAD DATA INFILE '/usr/tmp/file2.txt' INTO TABLE test_table1 FIELDS

TERMINATED BY',' ENCLOSED BY '"';

   这样文本也满足要求,分隔符为逗号,字符串中虽然出现了分隔符,但是字符串被双引号包围了,所以不用进行转义也可以识别,因为ESCAPED默认值是空,所以可以省略。也可以成功导入。

mysql> select* from test_table1;

+------+-------------------+-----------+

| id | textfield| numerical |

+------+-------------------+-----------+

| 1 | one, twoor three | 1234 |

| 1 | one, twoor three | 1234 |

+------+-------------------+-----------

 

FIELDS ESCAPEDBY

刚才介绍了如果列分隔符出现实际数据中应该怎么处理,那么ENCLOSED的符号出现在真实数据中呢。下面举个例子one“and” two是文本字段

1,"one\"and\" two",1234

LOAD DATA INFILE'/usr/tmp/file3.txt' INTO TABLE test_table1 FIELDS

TERMINATED BY',' ENCLOSED BY '"' ESCAPED BY '\\';

 

   分隔符是逗号,字符串包围符号是双引号,包围符出现在了真实数据中,所以必须有转义符才能被infobright识别,通过设置ESCAPED

 

mysql> select* from test_table1;

+------+-------------------+-----------+

| id | textfield| numerical |

+------+-------------------+-----------+

| 1 | one, twoor three | 1234 |

| 1 | one, twoor three | 1234 |

| 1 | one"and" two | 1234 |

+------+-------------------+-----------+

上面的两个例子说明了,我们在数据清洗时候需要对特殊字符进行转义,在导入时才会被infobright识别。

 

ESCAPE CHARACTERS

有的文本包含转义字符,这些设置ESCAPED,否则会作为字符串载入

例如:

2,other\t\t\ttext,4567

看看加与不加的区别

 

LOAD DATA INFILE'/usr/tmp/file4.txt' INTO TABLE test_table1 FIELDS

TERMINATED BY',' ENCLOSED BY 'NULL' ESCAPED BY '\\';

LOAD DATA INFILE'/usr/tmp/file4.txt' INTO TABLE test_table1 FIELDS

TERMINATED BY',' ENCLOSED BY 'NULL';

mysql> select* from test_table1;

+------+--------------------------------+-----------+

| id | textfield| numerical |

+------+--------------------------------+-----------+

| 2 | other text| 4567 |

| 2 | other\t\t\ttext | 4567 |

+------+--------------------------------+-----------+

2 rows in set(0.00 sec)

 

最后需要注意的是,infobright装载机问题,在相同参数的情况导入再导出,数据会发生变化。下面举个例子说明infobright装载机和mysql的处理的区别。

CREATE TABLE`test1` (
  `n` char(10) COLLATE latin1_bin DEFAULT NULL,
  `m` char(10) COLLATE latin1_bin DEFAULT NULL
) ENGINE=BRIGHTHOUSE DEFAULT CHARSET=latin1 COLLATE=latin1_bin

CREATE TABLE`test2` (
  `n` char(10) COLLATE latin1_bin DEFAULT NULL,
  `m` char(10) COLLATE latin1_bin DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_bin

mysql> select* from test1;
+———+———+
| n   | m   |
+———+———+
| a”\b | c”\d |
+———+———+
1 row in set (0.01 sec)

mysql> select* from test2;
+———+———+
| n   | m   |
+———+———+
| a”\b | c”\d |
+———+———+
1 row in set (0.00 sec)

mysql> select* from test1 into outfile ‘/tmp/test1.txt’ FIELDS TERMINATED BY ‘;’ ENCLOSED BY‘“’ ESCAPED BY ‘\\’;    
Query OK, 1 row affected (0.01 sec)

mysql> select* from test2 into outfile ‘/tmp/test2.txt’ FIELDS TERMINATED BY ‘;’ ENCLOSED BY‘“’ ESCAPED BY ‘\\’;
Query OK, 1 row affected (0.00 sec)

[root@wanglocal]# cat /tmp/test1.txt 
“a\”\b”;“c\”\d”
[root@wang local]# cat /tmp/test2.txt 
“a\”\\b”;“c\”\\d”

mysql> loaddata infile ‘/tmp/test1.txt’ into table test1 FIELDS TERMINATED BY ‘;’ ENCLOSEDBY ‘“’ ESCAPED BY ‘\\’; 
Query OK, 1 row affected (0.10 sec)

mysql> loaddata infile ‘/tmp/test2.txt’ into table test2 FIELDS TERMINATED BY ‘;’ ENCLOSEDBY ‘“’ ESCAPED BY ‘\\’;  
Query OK, 1 row affected (0.00 sec)

mysql> select* from test1;
+———+———+
| n   | m   |
+———+———+
| a”\b | c”\d |
| a | c"d |
+———+———+
2 rows in set (0.00 sec)

mysql> select* from test2;
+———+———+
| n   | m   |
+———+———+
| a”\b | c”\d |
| a”\b | c”\d |
+———+———+
2 rows in set (0.00 sec)

这个例子对BRIGHTHOUSEmyisam表分别进行导出再导入操作,TERMINATED是分号,ESCAPED符号是双引号,转义符是反斜杠。

而表内数据的内容包含了双引号和反斜杠。

Mysql loader的处理比较智能。数据中包含了ENCLOSED,所以在双引号前加了转义符反斜杠。数据中本来就有的反斜杠,因为和ESCAPED的反斜杠,也进行了一次转义。

Infobrightloader只处理了和ENCLOSED一样的字符。

这个例子说明Infobright loader在使用上受到的限制还是比较多的。