web*_*dev 4 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.select(completeRecord.col("Feed.Record.AllColumns"));
Run Code Online (Sandbox Code Playgroud)
我有大约 2000 个带有此类记录的文件。我已经单独测试了一些文件,它们运行良好。但是对于某些文件,我在第二行遇到以下错误:
org.apache.spark.sql.AnalysisException:无法从 Feed#8.Record 中提取值:需要结构类型但得到字符串;
我不确定这里发生了什么。但我想优雅地处理这个错误并记录哪个文件具有该记录。另外,有没有办法忽略这一点并继续处理其余文件?
根据我所学到的回答我自己的问题。有几种方法可以解决它。Spark 提供了忽略损坏文件和损坏记录的选项。
要忽略损坏的文件,可以将以下标志设置为 true:
spark.sql.files.ignoreCorruptFiles=true
为了更细粒度的控制并忽略坏记录而不是忽略完整的文件。您可以使用 Spark api 提供的三种模式之一。
根据DataFrameReader api
模式(默认PERMISSIVE):允许在解析过程中处理损坏记录的模式。 PERMISSIVE:当遇到损坏的记录时将其他字段设置为空,并将格式错误的字符串放入由 columnNameOfCorruptRecord 配置的新字段中。当用户设置模式时,它会为额外的字段设置 null。
DROPMALFORMED:忽略整个损坏的记录。
FAILFAST:遇到损坏的记录时抛出异常。
PERMISSIVE 模式对我来说非常有效,但是当我提供自己的架构时,Spark 用 null 填充缺失的属性而不是将其标记为损坏的记录。
归档时间: |
|
查看次数: |
3126 次 |
最近记录: |