[英]Error handling in list of scala futures - Apache Spark
我在處理 Scala 期貨列表中的異常時遇到問題。 我在ruuner
方法中調用getQC_report(qcArgsThread,spark)
方法,該方法處理輸入文件並保存在 Hive 表中。 下面的代碼
import scala.util.{Failure, Success}
import scala.concurrent._
import scala.concurrent.duration._
val spark = SparkSession.builder.master("yarn").enableHiveSupport().getOrCreate()
var argsList: List[Array[String]] = List[Array[String]]()
for(ip_file <- INPUT_FILE.asScala.toList) {
var qcArgs:Array[String] = null
qcArgs = Array("input_file", ip_file,
"hiveDB",hiveDB,
"Outputhive_table",Outputhive_table)
argsList = qcArgs :: argsList
}
var pool = 0
def poolId = {
pool = pool + 1
pool
}
def runner(qcArgsThread: Array[String]) = Future {
sc.setLocalProperty("spark.scheduler.pool", poolId.toString)
getQC_report(qcArgsThread,spark)
}
val futures = argsList map(i => runner(i))
futures foreach(f => Await.ready(f, Duration.Inf))
futures.onComplete {
case Success(x) => {
println(s"\nresult = $x")
}
case Failure(e) => {
System.err.println("Failure happened!")
System.err.println(e.getMessage)
}
}
我在futures.onComplete
行中遇到錯誤。
錯誤 - 無法解析符號 onComplete。
請幫助我改進代碼,因為我不熟悉使用 Scala 期貨。 謝謝!
簡短的回答是因為argsList
是List[Array[String]]
val futures = argsList map(i => runner(i))
將具有類型List[Future[WhateverGetQC_ReportReturns]]
。 它具體不是Future
,因此沒有onComplete
方法。
如果您希望擁有一個在所有期貨完成后完成的Future
, Future.sequence
會將List[Future[T]]
轉換為Future[List[T]]
:
// replaces all code after val futures = argsList map ...
val allFutures = Future.sequence(futures)
val result: List[WhateverGetQC_ReportReturns] =
try {
Await.result(allFutures, Duration.Inf)
} catch {
case NonFatal(e) =>
System.err.println("Failure happened!")
System.err.println(e.getMessage)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.