我有一个要求,我想要缓存数据集,然后通过触发" N"来计算一些指标。在该数据集上并行查询的数量和所有这些查询计算类似的度量,只是过滤器会改变,我想并行运行这些查询,因为响应时间至关重要,我想要缓存的数据集总是小于a GB的大小。
我知道如何在Spark中缓存数据集,然后再查询它,但如果我必须在同一数据集上并行运行查询,我该如何实现相同的目标呢?介绍alluxio是一种方式,但我们可以在Spark世界中实现相同的任何其他方式吗?
例如使用Java,我可以将数据缓存在内存中,然后通过使用多线程我可以实现相同的功能,但是如何在Spark中实现呢?
答案 0 :(得分:2)
使用Scala的并行集合在Spark的驱动程序代码中触发并行查询非常简单。这是一个最小的例子:
val dfSrc = Seq(("Raphael",34)).toDF("name","age").cache()
// define your queries, instead of returning a dataframe you could also write to a table etc
val query1: (DataFrame) => DataFrame = (df:DataFrame) => df.select("name")
val query2: (DataFrame) => DataFrame = (df:DataFrame) => df.select("age")
// Fire queries in parallel
import scala.collection.parallel.ParSeq
ParSeq(query1,query2).foreach(query => query(dfSrc).show())
编辑:
要在地图中收集查询ID和结果,您应该:
val resultMap = ParSeq(
(1,query1),
(2,query2)
).map{case (queryId,query) => (queryId,query(dfSrc))}.toMap