问题描述
在使用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,为特殊数据。