Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark中模式不匹配的处理_Scala_Apache Spark - Fatal编程技术网

Scala Spark中模式不匹配的处理

Scala Spark中模式不匹配的处理,scala,apache-spark,Scala,Apache Spark,我正在使用Scala中的Spark读取csv文件。 模式是预定义的,我正在使用它进行阅读。 这是示例代码: // create the schema val schema= StructType(Array( StructField("col1", IntegerType,false), StructField("col2", StringType,false), StructField("col3", StringType,true))) // Initi

我正在使用Scala中的Spark读取csv文件。 模式是预定义的,我正在使用它进行阅读。 这是示例代码:

// create the schema
val schema= StructType(Array(
      StructField("col1", IntegerType,false),
      StructField("col2", StringType,false),
      StructField("col3", StringType,true)))

// Initialize Spark session
val spark: SparkSession = SparkSession.builder
    .appName("Parquet Converter")
    .getOrCreate

// Create a data frame from a csv file
val dataFrame: DataFrame =
spark.read.format("csv").schema(schema).option("header", false).load(inputCsvPath)
根据我在使用模式阅读带有Spark的cav时所读到的内容,有3个选项:

  • 将模式设置为
    dropmorformed
    -->这将删除与架构不匹配的行
  • 将模式设置为“允许”-->这将整行设置为空值
  • 将模式设置为FAILFAST-->当发现不匹配时,将引发异常
  • 组合选项的最佳方式是什么?我想要的行为是获取模式中的不匹配,将它们打印为错误,并忽略数据帧中的行。 基本上,我希望结合FAILFAST和DROPMALFORMED


    提前感谢

    只需使用
    DROPMALFORMED
    并按照日志操作即可。如果存在格式不正确的记录,则会将其转储到日志中,直到
    maxmlformedlogperpartition
    选项设置的限制

    spark.read.format(“csv”)
    .schema(schema)
    .选项(“标题”,false)
    .选项(“模式”、“格式不正确”)
    .option(“maxMalformedLogPerPartition”,128)
    .load(inputCsvPath)
    
    这就是我最终所做的:
    我在模式中添加了“\u corrupt\u record”列,例如:

    val schema= StructType(Array(
        StructField("col1", IntegerType,true),    
        StructField("col2", StringType,false),
        StructField("col3", StringType,true),
        StructField("_corrupt_record", StringType, true)))
    
    然后我使用许可模式读取CSV(默认为Spark):

    现在,我的数据框包含一个额外的列,该列包含模式不匹配的行。 我筛选了数据不匹配的行,并将其打印出来:

    val badRows = dataFrame.filter("_corrupt_record is not null")
    badRows.cache()
    badRows.show()
    

    这个格式错误的记录在哪里转储并存储在哪个位置?我们还需要指定位置吗?
    val badRows = dataFrame.filter("_corrupt_record is not null")
    badRows.cache()
    badRows.show()