sqoop 导出如果分隔符指定的不对会导致hive 进sqoop 数据不能正确的分隔,会造成导出任务失败。
Hive应用:选取分隔符
在使用hive的时候,分隔符是必不可少的,当学习的时候使用的都是常规分隔符,比如:逗号“,”、竖线“|”等,这些键盘上都可以直接输入的字符,但是这些字符只要是键盘上的,在针对复杂的业务逻辑的时候,都会失效。
比如你有一个备注字段,这个字段允许用户输入输入键盘上的任何字符,一旦用户输入了你选择的分隔符,那么Hive在使用这个数据的时候,就会导致hive表中的字段错位。
使用多个组合字符,也可以成为一种选择,但是有些导入导出工具,不支持多字符分隔符,比如:阿里的DATAX就不支持多字符分隔符。
那么现在我们就需要一种字符,是用户输入不了的,计算机又存在的字符,下面这些字符则可以满足需求!
1、特殊字符
以下这些字符是可以在Hive中应用,并且DATAX也支持的:
char | digraph | hex | dec | official name | Unicode |
---|---|---|---|---|---|
^@ | NU | 0x00 | 0 | NULL (NUL)N | \u0000 |
^A | SH | 0x01 | 1 | START OF HEADING (SOH) | \u0001 |
^B | SX | 0x02 | 2 | START OF TEXT (STX) | \u0002 |
^C | EX | 0x03 | 3 | END OF TEXT (ETX) | \u0003 |
^D | ET | 0x04 | 4 | END OF TRANSMISSION (EOT) | \u0004 |
^E | EQ | 0x05 | 5 | ENQUIRY (ENQ) | \u0005 |
^F | AK | 0x06 | 6 | ACKNOWLEDGE (ACK) | \u0006 |
^G | BL | 0x07 | 7 | BELL (BEL) | \u0007 |
^H | BS | 0x08 | 8 | BACKSPACE (BS) | \u0008 |
^I | HT | 0x09 | 9 | CHARACTER TABULATION (HT) | \u0009 |
^@ | LF | 0x0a | 10 | LINE FEED (LF) | \u0010 |
^K | VT | 0x0b | 11 | LINE TABULATION (VT) | \u0011 |
^L | FF | 0x0c | 12 | FORM FEED (FF) | \u0012 |
^M | CR | 0x0d | 13 | CARRIAGE RETURN (CR) | \u0013 |
注意:特殊符号中的^ 和键盘上的^ 字符是不一样的。另外特殊符号中的^和后面跟的字符是一体的,也就是说,两个字符是一个符号。
问题来了 如果hive 的数据中包含这种数据,你不看hdfs 文件的话,打死也发现不了
这种情况要根据错误找到数据错误的行,来定位数据在哪 yarn上mapreduce的日志里会打印出有错误数据的行,然后把hdfs的文件下载下来查看,文本编辑器打开,我用的数sublime 能显示出来。
在 sqoop 的命令里添加 -Dorg.apache.sqoop.export.text.dump_data_on_error=true
sqoop export -Dorg.apache.sqoop.export.text.dump_data_on_error=true \
然后正则匹配替换掉
regexp_replace(m.changed_way,'([\\u0000-\\u0013]+)','')