如何使用Scala处理数据帧中的ValueError
我正在使用Scala开发Spark,我没有Scala的任何背景知识。我还没有得到ValueError,但是我正在为我的代码准备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 | 如果我
|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次。