解決Sqoop傳輸數據過程中的字段數異常


問題描述

在使用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,爲特殊數據。

發佈了148 篇原創文章 · 獲贊 39 · 訪問量 69萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章