2017-05-11 54 views
0

我想稍微改善了下面的代碼:入門`Any`代替序號[數據框]

val filePathsList = Seq("path_1","path_2) 

var seqdf = filePathsList.map(path => { 
     try { 
      sqlContext.read.format("json").load(path) 
     } catch { 
      case e: Exception => e.printStackTrace() 
     } 
}) 

現在seqdf有型Any,因爲我加try ... catch。我需要seqdf的類型爲Seq[DataFrame],同時保留try ... catch的情況下json文件不存在於path。我怎麼才能得到它?

+0

嘗試在try/catch子句中返回'Seq'。 – Reactormonk

+0

更具體地說,在發生異常的情況下返回'Nil',或者如果要停止執行則返回'sys.error(...)'。 – Eric

+0

@Eric:'case e:return Nil'?不,我不想停止這個過程。我只想忽略不正確的路徑。 – user7379562

回答

3

使用flatMap並選擇自動擺脫無效值

var seqdf = filePathsList.flatMap(path => { 
     try { 
      Some(sqlContext.read.format("json").load(path)) 
     } catch { case e: Exception => 
      e.printStackTrace() 
      None 
     } 
}) 

的如果你不真正關心的堆棧跟蹤,然後一個更簡潔版本如下所示

var seqdf = filePathsList.flatMap(path => { 
     Try(sqlContext.read.format("json").load(path)).toOption 
}) 
+0

我認爲理解會使代碼更漂亮。 –

2

使用scala TrygetOrElse哪個比java更高效trycatch。如果找不到路徑,您可以返回空dataframe

 import sqlContext.implicits._ 
     var seqdf = filePathsList.map(path => { 
     Try(
      sqlContext.read.format("json").load(path) 
     ) getOrElse Seq.empty[String].toDF() 
     }) 

希望這是有益

+0

很確定它不是更高效,但合作更好,因爲它是一流的結構。 – Reactormonk

+0

我需要排除空的數據框。在評論中建議使用'flatMap'。您能否通過展示如何讓'seqdf'僅包含非空數據框來詳細說明您的答案? – user7379562

+0

'seqdf.filterNot(_。isEmpty)' –