【发布时间】:2017-05-26 23:25:10
【问题描述】:
我正在使用 scala 的 /: 运算符计算一系列数据集聚合。下面列出了聚合的代码:
def execute1(
xy: DATASET,
f: Double => Double): Double = {
println("PRINTING: The data points being evaluated: " + xy)
println("PRINTING: Running execute1")
var z = xy.filter{ case(x, y) => abs(y) > EPS}
var ret = - z./:(0.0) { case(s, (x, y)) => {
var px = f(x)
s + px*log(px/y)}
}
ret
}
当我尝试运行作为 f 参数传入的单独函数列表的块时,会出现我的问题。函数列表是:
lazy val pdfs = Map[Int, Double => Double](
1 -> betaScaled,
2 -> gammaScaled,
3 -> logNormal,
4 -> uniform,
5 -> chiSquaredScaled
)
通过列表运行聚合的执行器函数是:
def execute2(
xy: DATASET,
fs: Iterable[Double=>Double]): Iterable[Double] = {
fs.map(execute1(xy, _))
}
最后的执行块:
val kl_rdd = master_ds.mapPartitions((it:DATASET) => {
val pdfsList = pdfs_broadcast.value.map(
n => pdfs.get(n).get
)
execute2(it, pdfsList).iterator
问题是,虽然确实发生了聚合,但它们似乎都聚合在输出数组的第一个槽中,而我希望单独显示每个函数的聚合。我进行了测试以确认所有五个函数实际上都在运行,并且它们在第一个槽中被求和。
The pre-divergence value: -4.999635700491883
The pre-divergence value: -0.0
The pre-divergence value: -0.0
The pre-divergence value: -0.0
The pre-divergence value: -0.0
这是我遇到过的最困难的问题之一,因此任何方向都将不胜感激。将给予应得的信用。谢谢!
【问题讨论】:
标签: scala apache-spark apache-spark-dataset