此次踩坑背景:
工作中使用sqoop同步工具從hive同步數據到mysql中時,遇到報錯信息如下。
前提:本次出錯由於一個字段是用戶輸入的文本數據,可能包含未知的特殊字符導致本次同步時出錯。
Error: java.io.IOException: Can't export data, please check failed map task logs
Caused by: java.lang.RuntimeException: Can't parse input data: '0'
第一步:google搜“Can’t parse input data: ‘0’”
收穫的信息大致都是:
數據中的分隔符與sqoop配置的分隔符不一致導致解析出錯。
第二步:檢查本次sqoop同步任務配置以及同步數據
同步數據:
- 本次同步的數據格式爲hive默認的textfile格式,列默認分隔符爲’\0001’,行默認分隔符爲’\n’
同步任務配置:
- 列分割符爲’\0001’,行分隔符爲’\n’
顯然不是同步任務配置與數據本身分隔符不一致導致的。
第三步:找到出錯分區數據,手動排錯
通過具體報錯信息,找到了具體的錯誤數據分區,由於分區數據不多,決定把數據從hdfs上下載下來,排錯。在沒有google到跟自己類似的錯誤情況只能這樣幹了!
第四步:果然被我發現了你!!
<0x01>:代表’\0001’
<0x00>:那你是什麼玩意???
經我翻閱ASCII編碼表終於找到的答案!!哈哈哈!!
<0x00>原來是空字符的含義哈,但是這裏的null和我們數據中的null值不一樣,hive表中null值是用’\N’表示。
發現問題之後,接下來就是把這個特殊玩意給我替換掉,用的也是我們經常會用到的函數,regexp_replace()。
具體操作:regexp_replace(col1,’\\0000’,’’) as col1。這裏需要使用’\\'進行轉義一次哦!!
到這裏,我們就把這個問題解決了!!
希望這篇文章可以幫到遇到這個問題絞盡腦汁的你!!