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不知道one与two之间的逗号到底是分隔符还是真实的字符
文本和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 '\\';
这样的文本就可以满足要求,分隔符是逗号,而且字符串也没有设置包围的字符,one与two之间的逗号也被加了转义,可以成功导入。
另一种方法:
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)
这个例子对BRIGHTHOUSE和myisam表分别进行导出再导入操作,TERMINATED是分号,ESCAPED符号是双引号,转义符是反斜杠。
而表内数据的内容包含了双引号和反斜杠。
Mysql loader的处理比较智能。数据中包含了ENCLOSED,所以在双引号前加了转义符反斜杠。数据中本来就有的反斜杠,因为和ESCAPED的反斜杠,也进行了一次转义。
Infobrightloader只处理了和ENCLOSED一样的字符。
这个例子说明Infobright loader在使用上受到的限制还是比较多的。