在Scala Flink中映射值不返回任何内容

时间:2018-06-27 09:20:06

标签: scala mapping apache-flink kryo

我正在用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))
  }

离散化效果很好。

可能会发生什么?

更新2

经过几天的搜索,看来问题出在番石榴的收藏MinMaxPriorityQueue。但是,我找不到任何可以帮助我序列化此集合的东西,这是到目前为止我找到的东西:

  • How do you serialize a guava collection?
  • magro/kryo-serializers这是番石榴集合的序列化器集合,但MinMaxPriorityQeue不存在
  • 我尝试了this,该过程包括注册kryo序列化程序env.getConfig.registerTypeWithKryoSerializer(classOf[MinMaxPriorityQueue[Double]], classOf[JavaSerializer]),但不起作用。
  • 我还尝试添加没有运气的Kryo默认的env.getConfig.addDefaultKryoSerializer(classOf[MinMaxPriorityQueue[Double]], classOf[JavaSerializer])序列化程序

0 个答案:

没有答案