簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM