我使用Scala开发Spark,我没有任何Scala背景。我没有得到ValueError,但我正在为我的代码准备ValueError Handler。
|location|arrDate|deptDate|
|JFK |1201 |1209 |
|LAX |1208 |1212 |
|NYC | |1209 |
|22 |1201 |1209 |
|SFO |1202 |1209 |
如果我们有这样的数据,我想将第三行和第四行存储到Error.dat中,然后再次处理第五行。在错误日志中,我想提供数据的信息,例如哪个文件,行数和错误详细信息。对于记录器,我现在正在使用log4j。
实现该功能的最佳方法是什么?你能帮助我吗?
答案 0 :(得分:1)
我假设所有三列都是String类型。在这种情况下,我会使用下面的代码解决这个问题。我创建了两个udf来检查错误记录。
isNumber
] isEmpty
] 代码段
import org.apache.spark.sql.functions.row_number
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions.udf
val df = rdd.zipWithIndex.map({case ((x,y,z),index) => (index+1,x,y,z)}).toDF("row_num", "c1", "c2", "c3")
val isNumber = udf((x: String) => x.replaceAll("\\d","") == "")
val isEmpty = udf((x: String) => x.trim.length==0)
val errDF = df.filter(isNumber($"c1") || isEmpty($"c2"))
val validDF = df.filter(!(isNumber($"c1") || isEmpty($"c2")))
scala> df.show()
+-------+---+-----+-----+
|row_num| c1| c2| c3|
+-------+---+-----+-----+
| 1|JFK| 1201| 1209|
| 2|LAX| 1208| 1212|
| 3|NYC| | 1209|
| 4| 22| 1201| 1209|
| 5|SFO| 1202| 1209|
+-------+---+-----+-----+
scala> errDF.show()
+-------+---+----+----+
|row_num| c1| c2| c3|
+-------+---+----+----+
| 3|NYC| |1209|
| 4| 22|1201|1209|
+-------+---+----+----+