关于利用sqoop导入数据到hive当中的的空值的处理方式

最近在做sqoop的增量导入操作,但是当我们在导入数据的时候出现合并失败的现象。出现的错误如下:

2019-01-18 15:10:57,919 INFO [IPC Server handler 1 on 60362] org.apache.hadoop.mapred.TaskAttemptListenerImpl: Diagnostics report from attempt_1547607331917_0149_m_000000_0:
Error: java.lang.RuntimeException: Can't parse input data: '\N' at QueryResult.__loadFromFields(QueryResult.java:2240) at QueryResult.parse(QueryResult.java:1988) at org.apache.sqoop.mapreduce.MergeTextMapper.map(MergeTextMapper.java:53) at org.apache.sqoop.mapreduce.MergeTextMapper.map(MergeTextMapper.java:34) at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:793) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1917) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) Caused by: java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff] at java.sql.Timestamp.valueOf(Timestamp.java:202) at QueryResult.__loadFromFields(QueryResult.java:2227) ... 11 more

这个是错误是在合并的时候出现的,看到这个错误我们首先想到的是我们hive当中数据的存储情况,知其然并知其所以然。所以我们要深究hive的数据存储方式了。
我们都知道在hive当中默认对于null的处理是按照\n的方式进行处理的。但是我们可以修改hive当中的空值的存储。修改的方式有很多种。具体参考下面这篇

https://blog.csdn.net/lvhuiyin/article/details/77894289

另外我们在进行sqoop的数据导入的时候,通常会加上下面这两句:
--null-non-string '\\N' \
--null-string '\\N' \

看到这句应该不是很陌生,他就是将关系型数据库当中为空的字段进行处理,保存的格式不是null字符串而是以null,也就是真正的空值进行处理,使is null的语法生效,而不是=“null”
所以我们这里的占位符号,也可以根据hive建表的时候的情况进行定义,让hive表存储的数据是正真的null。

这个问题最终的解决方式是修改hive的null值存储,不适用默认的 \n 对数据进行存储,这样就解决了这个问题。所以看到后面的报错不一定就是时间的问题,要从原理上进行分析总结找问题。





posted on 2019-01-24 11:02  gxg123  阅读(1451)  评论(0编辑  收藏  举报

导航