Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.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
Java Spark:忽略或处理数据集选择错误_Java_Apache Spark_Apache Spark Sql_Spark Dataframe - Fatal编程技术网

Java Spark:忽略或处理数据集选择错误

Java Spark:忽略或处理数据集选择错误,java,apache-spark,apache-spark-sql,spark-dataframe,Java,Apache Spark,Apache Spark Sql,Spark Dataframe,我正在测试一些原型应用程序。我们有带嵌套字段的json数据。我尝试使用以下json和代码提取一些字段: Feed: {name: "test",[Record: {id: 1 AllColumns: {ColA: "1",ColB: "2"}}...]} Dataset<Row> completeRecord = sparkSession.read().json(inputPath); final Dataset<Row> feed = completeRecord.s

我正在测试一些原型应用程序。我们有带嵌套字段的json数据。我尝试使用以下json和代码提取一些字段:

Feed: {name: "test",[Record: {id: 1 AllColumns: {ColA: "1",ColB: "2"}}...]}

Dataset<Row> completeRecord = sparkSession.read().json(inputPath);
final Dataset<Row> feed = completeRecord.select(completeRecord.col("Feed.Record.AllColumns"));
我有大约2000份这样的档案。我已经单独测试了一些文件,它们工作正常。但对于某些文件,我在第二行得到以下错误:

org.apache.spark.sql.AnalysisException:无法从中提取值 Feed8.Record:需要结构类型,但得到字符串


我不知道这里发生了什么。但我想优雅地处理这个错误,并记录哪个文件有那个记录。另外,是否有任何方法可以忽略这一点并继续处理其余文件?

例外情况是,其中一个json文件的结构不同,并且路径Feed.Record.AllColumns在此特定文件中不存在

基于此方法

私有布尔路径existsdataset df,字符串路径{ 试一试{ df.applypath; 返回true; } 特例{ 返回false; } } 您可以决定是执行选择还是记录错误消息:

ifpathExistscompleteRecord,Feed.Record.AllColumns{ 最终数据集提要=completeRecord.selectcompleteRecord.colFeed.Record.AllColumns; //继续处理 } 否则{ //日志错误消息 }
根据我所学到的知识回答我自己的问题。有两种方法可以解决这个问题。Spark提供了忽略损坏文件和损坏记录的选项

要忽略损坏的文件,可以将以下标志设置为true:

spark.sql.files.ignoreCorruptFiles=true

用于更细粒度的控制,并忽略坏记录,而不是忽略完整的文件。您可以使用Spark api提供的三种模式之一

根据api

模式默认许可:允许使用模式处理损坏的 解析过程中的记录。 PERMISSIVE:当设置为空时,将其他字段设置为空 遇到损坏的记录,并将格式错误的字符串放入新的 由columnNameOfCorruptRecord配置的字段。当模式由设置时 用户,它为额外字段设置null。 dropmorformed:忽略整个 损坏的记录。 FAILFAST:遇到异常时抛出异常 损坏的记录


许可模式对我来说非常有效,但当我提供自己的模式时,Spark用null填充缺少的属性,而不是将其标记为损坏的记录。

谢谢,这非常有用。我还添加了一些关于如何忽略不良记录的信息。