- 论坛徽章:
- 0
|
今天做ETL时从 mysql导数据到 greenplum ,有个text字段中包含换行符.导致导入过程诸多错误
mysql不会将换行符转义为\n\r . 而PG中导入文本时 , 固定的以\n\r为行记录分割符,不能自定义文本记录换行符.
当PG直接使用Mysql导出的包含\n\r换行符的文本数据导入时,Mysql中的单条记录会被PG误解为的多条记录.
看看Mysql和PG的导入和导出换行符的区别吧:
一 Mysql导出换行符的格式
1 mysql的原始数据:
select newline_text from user_data;
a
-------
usage
me
to
2 mysql中导的导出方式如下:
select newline_text into outfile 'user.dat' from user_data;
3 查看文本格式
# cat 'user.dat
usage
me
to
# cat 'user.dat|wc -l
3
二 PG导入和导出换行符的方式.
1 PG原始数据
mydb=# select * from text_newline;
a
-------
usage
me
to
(1 row)
2 导出数据
mydb=# copy text_newline to '/var/tmp/newline.txt';
3 查看数据格式
more /var/tmp/newline.txt
usage\n me\nto
4 导入数据
mydb=# create external table ext_newline(a text)
LOCATION ('gpfdist://visit-history1:8081/newline.txt ')
FORMAT 'TEXT';
5 查看数据,格式正确
mydb=# select * from ext_newline;
a
-------
usage
me
to
(1 row)
从上面两者换行符的导入导出格式可以看出来, Mysql中的换行符不做转义,直接包含写在文本数据中
PG导出的换行符做了转义,转义为\n字符串.
解决办法:从这个区别可以看出来,只需要把Mysql中导出换行符做转义,替换成显示的\r或\n就可以用来做PG的导入源了
用sed命令做转义: cat /var/tmp/newline.txt |sed 's/\r\\$//g;$!N;s/\n/\\r/'
可以先用 sed -n -e "l" newline.txt 看看转换前后的隐含字符. |
|