【发布时间】:2019-04-08 19:31:20
【问题描述】:
我正在尝试查询表,将查询的值存储在 Scala 映射中并返回相同的映射。 为此,我想出了以下代码:
def getBounds(incLogIdMap:scala.collection.mutable.Map[String, String]): Future[scala.collection.mutable.Map[String, String]] = Future {
var boundsMap = scala.collection.mutable.Map[String, String]()
incLogIdMap.keys.foreach(table => if(!incLogIdMap(table).contains("INVALID")) {
val minMax = s"select max(cast(to_char(update_tms,'yyyyddmmhhmmss') as bigint)) maxTms, min(cast(to_char(update_tms,'yyyyddmmhhmmss') as bigint)) minTms from queue.${table} where key_ids in (${incLogIdMap(table)})"
val boundsDF = spark.read.format("jdbc").option("url", commonParams.getGpConUrl()).option("dbtable", s"(${minMax}) as ctids")
.option("user", commonParams.getGpUserName()).option("password", commonParams.getGpPwd()).load()
val maxTms = boundsDF.select("minTms").head.getLong(0).toString + "," + boundsDF.select("maxTms").head.getLong(0).toString
boundsMap += (table -> maxTms)
}
)
boundsMap
}
为了从方法getBounds接收值,我使用了方法onCompletion如下:
val tmsobj = new MinMaxVals(spark, commonParams)
val boundsMap = tmsobj.getBounds(incLogIds)
boundsMap.onComplete({
case Success(value) =>
case Failure(value) =>
})
我以前在 Scala 中编写过代码,但我对 Scala 中的Futures 不熟悉。谁能告诉我如何将getBounds返回的值检索到val boundsMap中
【问题讨论】:
-
我看到您的回答,您提到“不建议从 Future 访问值,因为它违背了异步计算的目的”。在这种情况下,我如何将 Future 应用于方法并使用它返回的值?由于我对 Futures 缺乏了解,感到有些困惑。
-
我已经编辑了我的答案。如果这能回答您的问题,请告诉我
-
@Chaitanya,阅读您的答案,但我对其他燃烧的疑问感到困惑 -> 如果不建议检索 Future 的值,我如何/何时访问 Future 的结果?如果 Future 的目的是运行独立于主线程的线程/进程,为什么不建议访问它? Future 会自动将其输出分配给它的调用者吗?
标签: scala apache-spark