關於sqoop增量導入過程中,文件合並遇到的問題。
阿新 • • 發佈:2019-01-12
creat val .com lar col 數據導入 sun 遇到的問題 圖片
今天在多sqoop的增量導入操作,遇到下面這個問題(報錯如下):
2019-01-12 14:20:54,332 FATAL [IPC Server handler 0 on 38807] org.apache.hadoop.mapred.TaskAttemptListenerImpl: Task: attempt_1546053074766_0445_m_000000_0 - exited :
java.lang.RuntimeException: Can‘t parse input data: ‘ sunt in culpa qu‘ at FRONTBANK_INCREAT_TABLE.__loadFromFields(FRONTBANK_INCREAT_TABLE.java:321) at FRONTBANK_INCREAT_TABLE.parse(FRONTBANK_INCREAT_TABLE.java:259) 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:235) at FRONTBANK_INCREAT_TABLE.__loadFromFields(FRONTBANK_INCREAT_TABLE.java:318) ... 11 more
看到上面這個錯誤,一定會時間的問題,其實不然,這就牽扯到sqoop導入數據的註意事項。我們知道在sqoop導入數據的時候是按照某個特定的分割符號進行分割的。
在這裏我是按照逗號去分割每一行的字段。當這一行的數據更新之後我們按照更新時間對數據進行進行新增,更新操作(這裏註意不能做刪除操作)這個錯誤是在將增量數據導入進來之後,
和原始的數據做merge操作的時候出現的,也就是說數據在更新的時候出現的(數據錯位)。下面分析一下這個錯誤:
這裏有一個逗號,當好我的默認分割符號是逗號,也就是在檢查完這一行數據是更新的數據,然後按照一個一個字段進行匹配的時候,突然將時間賦值給這個字符串的時候就出現問題了
所以才會報 Caused by: java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff] 也就是匹配錯誤的意思。
所以在sqoop導入數據的時候分割符號是很重要(sqoop的分隔符是一個頭疼的事情。解決方法就是更換分隔符)
至此問題得到解決
關於sqoop增量導入過程中,文件合並遇到的問題。