問題描述
在使用Sqoop將數據表導入到HDFS,再將HDFS的表文件導出時,往往會出現無法解析xxx
值的錯誤,這種情況往往是該行的字段數異常(多或少)導致。
解決方案
寫個簡單的程序,將字段數異常的行找出來。
測試數據
1 aa bb cc
2 fjd fjasl jfals
3 jfas fda jjfas jald
4 fjd fjasl jfals
5 fjd fjasl jfals
6 fjd fjasl jfals
7 fjd fjasl jfals
8 fjd fjasl jfals
9 fjd fjasl jfals
10 fjd fjasl jfals
11 fjd fjasl jfals
簡單程序
// 讀取數據,按空格分割,也可自定義其他分隔符
val dataFile = sc.textFile("hdfs://your-host:8020/user/hdfs/test.txt") // Create an RDD called lines
val data = dataFile.map(line => line.split(" ")).map(x=>(x.size,x(0))).groupByKey() // 字段數,記錄id集合
val data1 = data.map(x=>( x._2.size, x._1) ) // 記錄數,字段數
// 每行應當有的字段數
val fields_common = data1.sortByKey(false).take(1).map(x => x._2 )
fields_common
println("每行的字段數應該有" + fields_common.mkString(" ") + "個")
// 獲取特殊的記錄(字段數異常的記錄)
val special_rows = data.filter( _._1 != fields_common(0) )
println("特殊的記錄如下,格式爲(字段數,id集合)")
special_rows.collect
輸出
每行的字段數應該有4個
特殊的記錄如下,格式爲(字段數,id集合)
Array((5,CompactBuffer(3)))
結果顯示,有一記錄的字段數爲5,id爲3,爲特殊數據。