如何使用Scala处理数据帧中的ValueError

如何使用Scala处理数据帧中的ValueError,scala,apache-spark,dataframe,spark-dataframe,Scala,Apache Spark,Dataframe,Spark Dataframe,我正在使用Scala开发Spark,我没有Scala的任何背景知识。我还没有得到ValueError,但是我正在为我的代码准备ValueError处理程序 |location|arrDate|deptDate| |JFK |1201 |1209 | |LAX |1208 |1212 | |NYC | |1209 | |22 |1201 |1209 | |SFO |1202 |1209 | 如果我

我正在使用Scala开发Spark,我没有Scala的任何背景知识。我还没有得到ValueError,但是我正在为我的代码准备ValueError处理程序

|location|arrDate|deptDate|
|JFK     |1201   |1209    |
|LAX     |1208   |1212    |
|NYC     |       |1209    |
|22      |1201   |1209    |
|SFO     |1202   |1209    |
如果我们有这样的数据,我想将第三行和第四行存储到Error.dat中,然后再次处理第五行。在错误日志中,我想输入数据的信息,例如哪个文件、行数以及错误的详细信息。对于logger,我现在使用log4j


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

我假设所有三列都是字符串类型。在这种情况下,我将使用下面的代码片段来解决这个问题。我创建了两个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|
+-------+---+----+----+

在什么条件下,第3行和第4行被拒绝为错误文件?@rogue one from 3'rd arrDate为空,第4行位置数据应为字符串。这是拒绝的条件。谢谢你的建议。另一个问题是,如果我想检查所有列是否有空列,该怎么办?这就是我检查所有列时所做的。@BryanK。我错过了你的评论。您可以对所有列应用相同的udf,以检查是否存在空白的stringval columnNames=Seq(“行数”、“c1”、“c2”、“c3”)var errDF=df.filter(isEmpty(columnNames.head、columnNames.tail:*),但它不起作用。有没有办法一次检查多个列?我创建序列是因为我有46个列,我不想运行46次。