为什么数据框未在Spark中抛出带有“ FAILFAST”选项的RunTimeException?

时间:2019-06-02 10:13:49

标签: apache-spark dataframe

我有以下输入文件,该文件可能有不好的记录,我想引发异常并确定列名列与我的自定义架构不同。 根据我的理解,即使我们不对其执行任何操作,数据框也应立即引发异常。

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();
    }

注意:如果数据类型不匹配,程序应该能够捕获列名,并继续执行流程(不应异常终止)。

1 个答案:

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