![](/img/trans.png)
[英]Handling comma delimited columns with dependency on another column in Spark dataset
[英]Spark: Ignoring or handling DataSet select errors
我正在測試一些原型應用程序。 我們有帶有嵌套字段的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:無法從Feed#8中提取值。Record:需要結構類型但得到了字符串;
我不確定這是怎么回事。 但我想優雅地處理此錯誤,並記錄哪個文件具有該記錄。 另外,有什么方法可以忽略這一點並繼續處理其余文件嗎?
根據我所學的知識回答我自己的問題。 有幾種解決方法。 Spark提供了忽略損壞的文件和損壞的記錄的選項。
要忽略損壞的文件,可以將以下標志設置為true:
spark.sql.files.ignoreCorruptFiles =真
為了獲得更精細的控制,並忽略不良記錄,而不是忽略整個文件。 您可以使用Spark api提供的三種模式之一。
根據DataFrameReader api
模式(默認為PERMISSIVE ):允許使用一種模式在解析期間處理損壞的記錄。 PERMISSIVE :遇到損壞的記錄時,將其他字段設置為null,並將格式錯誤的字符串放入由columnNameOfCorruptRecord配置的新字段中。 由用戶設置架構時,它會為其他字段設置null。
DROPMALFORMED :忽略整個損壞的記錄。
FAILFAST :遇到損壞的記錄時引發異常。
PERMISSIVE模式對我來說確實非常有效,但是當我提供自己的架構時,Spark會將缺少的屬性填充為null而不是將其標記為損壞的記錄。
異常表明,其中一個json文件的結構不同,並且此特定文件中不存在Feed.Record.AllColumns
路徑。
基於這種方法
private boolean pathExists(Dataset<Row> df, String path) {
try {
df.apply(path);
return true;
}
catch(Exception ex){
return false;
}
}
您可以決定執行select
還是記錄錯誤消息:
if(pathExists(completeRecord, "Feed.Record.AllColumns") {
final Dataset<Row> feed = completeRecord.select(completeRecord.col("Feed.Record.AllColumns"));
//continue with processing
}
else {
//log error message
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.