如何处理来自Dataframe的ValueError使用Scala

时间:2017-02-26 04:02:33

标签: scala apache-spark dataframe spark-dataframe

我使用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。

实现该功能的最佳方法是什么?你能帮助我吗?

1 个答案:

答案 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|
+-------+---+----+----+