我有以下输入文件,该文件可能有不好的记录,我想引发异常并确定列名列与我的自定义架构不同。 根据我的理解,即使我们不对其执行任何操作,数据框也应立即引发异常。
1,a,10000,11-03-2019,浦那
2,b,10020,14-03-2019,浦那
3,a,34567,15-03-2019,浦那
tyui,a,fgh-03-2019,pune
4,b,10020,14-03-2019,浦那
我尝试将spark数据帧设置为“ FAILFAST”选项,但最后没有引发任何异常。
我尝试了以下代码。
SparkSession ss = SparkSession.builder().appName("Data Quality Frameowrk")
.master("local")
.getOrCreate();
try {
StructField[] fields = new StructField[5];
fields[0] = new StructField("id", DataTypes.IntegerType, false,Metadata.empty());
fields[1] = new StructField("name", DataTypes.StringType, false,Metadata.empty());
fields[2] = new StructField("salary", DataTypes.DoubleType, false,Metadata.empty());
fields[3] = new StructField("dob", DataTypes.DateType, false,Metadata.empty());
fields[4] = new StructField("loc", DataTypes.StringType, false,Metadata.empty());
StructType customSchema = new StructType(fields);
ss.read().format("csv")
.schema(customSchema)
.option("mode", "FAILFAST")
.load("C:\\\\Users\\\\manoj.dhake\\\\Downloads\\\\softwares\\\\neo4jdata\\\\employee.csv");
}catch(Exception e) {
System.out.println("want to catch column name ,due to which error has been occured");
e.printStackTrace();
}
注意:如果数据类型不匹配,程序应该能够捕获列名,并继续执行流程(不应异常终止)。
答案 0 :(得分:1)
这是因为Spark很懒,在调用load
时它甚至不读取数据,仅处理数据帧将触发实际读取。根据{{3}}
FAILFAST:遇到损坏的记录时引发异常。
因此,它与增加负载无关。可以通过手动触发处理来急切地完成验证,但是如果所有条目都有效,它将导致对所有数据进行两次处理。使用cache
可以在某种程度上减轻性能影响:
val df = spark.read
.schema(StructType(Seq(StructField("test", IntegerType))))
.option("mode", "FAILFAST")
.csv(Seq("a").toDS())
.cache()
df.count()
会抛出
aorg.apache.spark.SparkException: Malformed records are detected in record parsing. Parse Mode: FAILFAST.