infobright导入数据遇到特殊字符报错的解决方法,infobright特殊字符
目前在用的是社区版的infobright,不支持DML功能,只能用LOAD DATA方式导入数据。
如果元数据中有特殊控制字符,导入过程中经常会报错,很是恼火。应对策略有两种方法:
1.设置Reject File导入之前,设定 @BH_REJECT_FILE_PATH 和 @BH_ABORT_ON_COUNT 就可以忽略多少条导入失败的记录,并且将这些记录保存在指定文件
set @BH_REJECT_FILE_PATH = '/tmp/reject_file';
set @BH_ABORT_ON_COUNT = 10;
BH_ABORT_ON_COUNT 设定为 -1 的话,表示永不忽略。
也可以设置 BH_ABORT_ON_THRESHOLD 选项,该选项表示有最多多少百分比的数据允许被忽略,因此该选项的值是小数格式,例如 BH_ABORT_ON_THRESHOLD = 0.03(表示3%)
2.导出时指定结束符此外,还可以在导出数据时制定结束符,并且设定忽略哪些转义字符(\、”、' 等字符),例如:
3.或者,将行间隔符设定为其他特殊标识,例如:select fields_list… into outfile ‘/tmp/outfile.csv' fields terminated by ‘||' ESCAPED BY ‘\\' lines terminated by ‘$$$$$\r\n' from mytable;当然了,这种情况下,实际数据行中就不能存在 “$$$$$\r\n” 这个值了,否则会被当成换行标识。
对于DW系统而言,庞大数据的迁移成本很高;所以导入和导出的速率及容忍性也是考量数据仓库产品的重要标准。Infobright基于MySQL所以在数据格式上有比较成型的解决办法,IB原厂对速率进行了优化。在4.0企业版中推出了DLP分布式导入选件,极大的减少了迁移时间,目前世界最大的光通信提供商JDSU也选用了IB产品,并以DLP为主要选件进行配置。不过本文主要针对IB基本的导入导出进行介绍,加上在项目中遇到的特殊问题和解决办法。(在结尾处哦,呵呵)
1,简介
IB提供了专用的高性能loader,不同于传统的mysql。IB loader是为了提高导入速度而设计的,所以仅支持特有的mysqlloader语法,而且只支持导入格式化的变量和文本源文件
IEE也支持mysqlloader和insert语句
2,默认Loader
ICE仅支持IB lorder
IEE默认使用的是是mysql loader,它能更多的容错,但速度稍慢。为了最快的导入,使用IB loader,做以下环境的设置
Mysql>
set @bh_dataformat = ‘txt_variable’;
–使用IB loader来导入CSV格式的变量定长文本
set @bh_dataformat = ‘binary’;
–二进制文件
set @bh_dataformat = ‘mysql’;
–使用mysql loader
3,IB loader语法
IB仅支持load data infile,其他的mysql导入方式不支持
LOAD DATA INFILE ‘/full_path/file_name’
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY 'char']
[ENCLOSED BY 'char']
[ESCAPED BY 'char']
];
导入前关闭
set AUTOCOMMIT=0;
完成后
COMMIT;
set AUTOCOMMIT=1;
4,区域分隔符
.区域分隔符是可选的,默认设置为
CLAUSE DEFAULT VALUE
FIELDS TERMINATED BY ‘;’ (semicolon)
FIELDS ENCLOSED BY ‘”‘ (double quote)
FIELDS ESCAPED BY ” (none)
5,导入经验
a.当导入表格列数很多时,修改brighthouse.ini中LoaderMainHeapSize
b使用并发导入
c容忍性排序为txt_variables<binary<mysql
d bh_loader不支持多分隔符
e 大量数据时,DLP是必要选择
这时候,如果需要brighthouse引擎支持utf8字符集,需要:1. 数据库对象创建时务必使用utf8字符集,这点尤为关键,否则不可支持utf8;2. 数据表对象创建时也使用utf8字符集;3. 导入文件提前转换成utf8字符集;4. 连接infobright时,执行set names utf8;5. 导入文件,查看字符集是否正确;另一种场景下,可能myisam表也需要支持utf8,这个相对比较麻烦:1. 数据库对象创建时无所谓,不强制必须是utf8;2. 数据表对象创建时务必使用utf8字符集;