簡體   English   中英

scala 期貨列表中的錯誤處理 - Apache Spark

[英]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 期貨。 謝謝!

簡短的回答是因為argsListList[Array[String]]

val futures = argsList map(i => runner(i))

將具有類型List[Future[WhateverGetQC_ReportReturns]] 它具體不是Future ,因此沒有onComplete方法。

如果您希望擁有一個在所有期貨完成后完成的FutureFuture.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.

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