我正在用flink开发离散化算法,但是在应用map
函数时遇到了问题。
离散化存储在V
中,它是
private[this] val V = Vector.tabulate(nAttrs)(i => IntervalHeap(nBins, i, s))
此向量通过以下方法更新:
private[this] def updateSamples(v: LabeledVector): Vector[IntervalHeap] = {
val attrs = v.vector.map(_._2)
// TODO: Check for missing values
attrs
.zipWithIndex
.foreach {
case (attr, i) =>
if (V(i).nInstances < s) {
V(i) insert (attr)
} else {
if (randomReservoir(0) <= s / (i + 1)) {
val randVal = Random nextInt (s)
V(i) replace (randVal, attr)
}
}
}
V
}
map函数将数据集的每个实例都应用到函数updateSamples):
def discretize(data: DataSet[LabeledVector]) /*: DataSet[IntervalHeap]*/ = {
val d = data map (x => updateSamples(x))
log.debug(s"$V")
d print
}
但是,当我打印d
时,会得到V空:
Vector(Attr [0] [;][;][;][;][;])
Vector(Attr [0] [;][;][;][;][;])
Vector(Attr [0] [;][;][;][;][;])
Vector(Attr [0] [;][;][;][;][;])
Vector(Attr [0] [;][;][;][;][;])
Vector(Attr [0] [;][;][;][;][;])
Vector(Attr [0] [;][;][;][;][;])
Vector(Attr [0] [;][;][;][;][;])
Vector(Attr [0] [;][;][;][;][;])
Vector(Attr [0] [;][;][;][;][;])
我尝试过不返回V
中的updateSamples
,而是在应用地图后仅从driscretize
访问它,但同样如此。如果在updateSamples
内打印V
的值,则可以看到它正在更新。
如果我不使用容器DataSet[T]
,而是像这样使用Seq
:
def discretize(data: Seq[LabeledVector]) /*: DataSet[IntervalHeap]*/ = {
data map (x => updateSamples(x))
}
离散化效果很好。
可能会发生什么?
经过几天的搜索,看来问题出在番石榴的收藏MinMaxPriorityQueue
。但是,我找不到任何可以帮助我序列化此集合的东西,这是到目前为止我找到的东西:
MinMaxPriorityQeue
不存在kryo
序列化程序env.getConfig.registerTypeWithKryoSerializer(classOf[MinMaxPriorityQueue[Double]], classOf[JavaSerializer])
,但不起作用。Kryo
默认的env.getConfig.addDefaultKryoSerializer(classOf[MinMaxPriorityQueue[Double]], classOf[JavaSerializer])
序列化程序