首页 > 解决方案 > 地图操作中的Scala类型不匹配

问题描述

我正在以下代码中尝试对 Spark DStream 进行映射操作:

val hashesInRecords: DStream[(RecordKey, Array[Int])] = records.map(record => {
      val hashes: List[Int] = calculateIndexing(record.fields())
      val ints: Array[Int] = hashes.toArray(Array.ofDim[Int](hashes.length))
      (new RecordKey(record.key, hashes.length), ints)
    })

代码在 IntelliJ 中看起来不错,但是当我尝试构建时,我得到一个我不太明白的错误:

Error:(53, 61) type mismatch;
 found   : Array[Int]
 required: scala.reflect.ClassTag[Int]
      val ints: Array[Int] = hashes.toArray(Array.ofDim[Int](hashes.length))

即使我在映射操作中添加类型后,此错误仍然存​​在,如下所示:

records.map[(RecordKey, Array[Int])](record => {...

标签: scalaapache-sparkspark-streaming

解决方案


这应该可以解决您的问题,它也避免了List.lengthO ( N )的调用,而是使用O( 1 )Array.length代替。

val hashesInRecords: DStream[(RecordKey, Array[Int])] = records.map { record =>
  val ints = calculateIndexing(record.fields()).toArray
  (new RecordKey(record.key, ints.length), ints)
}

推荐阅读