作者:吃羊的肉 | 来源:互联网 | 2023-01-14 12:24
问题描述:hive中表使用sqoop导出数据到mysql中,对于一些地址字段,会报下面的错误15020508:30:45INFOmapred.JobClient:map0%red
问题描述:hive中表使用sqoop导出数据到mysql中,对于一些地址字段,会报下面的错误
15/02/05 08:30:45 INFO mapred.JobClient: map 0% reduce 0%
15/02/05 08:31:24 INFO mapred.JobClient: map 50% reduce 0%
15/02/05 08:31:26 INFO mapred.JobClient: Task Id : attempt_201411111542_1892827_m_000002_0, Status : FAILED
java.io.IOException: java.sql.SQLException: Incorrect string value: '\xF0\xA3\x84\x83\xE6\xB8...' for column 'DLVRY_ADDR_NM' at row 37
at org.apache.sqoop.mapreduce.AsyncSqlRecordWriter.write(AsyncSqlRecordWriter.java:220)
at org.apache.sqoop.mapreduce.AsyncSqlRecordWriter.write(AsyncSqlRecordWriter.java:46)
at org.apache.hadoop.mapred.MapTask$NewDirectOutputCollector.write(MapTask.java:638)
at org.apache.hadoop.mapreduce.TaskInputOutputContext.write(TaskInputOutputContext.java:80)
at org.apache.sqoop.mapreduce.hcat.SqoopHCatExportMapper.map(SqoopHCatExportMapper.java:135)
at org.apache.sqoop.mapreduce.hcat.SqoopHCatExportMapper.map(SqoopHCatExportMapper.java:53)
也就是DLVRY_ADDR_NM字段中值插入到mysql库中,有些'\xF0\xA3\x84\x83\xE6\xB8...' 这样的插不进去,感觉是乱码,网上查了原因是UTF-8编码有可能是两个、三个、四个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。使用alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin修改了mysql库的编码格式,可还是不行,不知道有哪位大神遇到过?
2 个解决方案
可以使用正则表达式对结果进行过滤
[^\\u4E00-\\u9FA5|a-z|A-Z|0-9|+ \\[\\] \/&\. ——_ ,()() \\\\|/-《 <>》¥$ °!! *::~ ?? ×]*','