我从自定义映射器中获取此Scala片段(用于Spark mapPartitions
)我正在编写以同时计算多个Int
字段的直方图。
def multiFeatureHistogramFunc(iter: Iterator[Row]) : Iterator[(Int, (Int, Long))] = {
var featureHistMap:Map[Int, (Int, Long)] = Map()
while (iter.hasNext)
{
val cur = iter.next;
indices.foreach( { index:Int =>
val v:Int = if ( cur.isNullAt(index) ) -100 else cur.getInt(index)
var featureHist:Map[Int, Long] = featureHistMap.getOrElse(index, Map())
val newCount = featureHist.getOrElse(v,0L) + 1L
featureHist += (v -> newCount)
featureHistMap += (index -> featureHist)
})
}
featureHistMap.iterator
}
但我得到的错误是:
<console>:49: error: type mismatch;
found : Equals
required: Map[Int,Long]
var featureHist:Map[Int, Long] =
featureHistMap.getOrElse(index, Map())
^
我找不到这个具体问题的答案。在我看来,featureHistMap.getOrElse
中的默认参数与featureHistMap
本身的值字段的类型不同,并且公共父类型为Equals
,因此这会导致类型不匹配。我尝试了许多不同的东西,比如将默认参数更改为更具体的类型,但这只会导致不同的错误。
有人可以解释这里发生了什么以及如何解决这个问题吗?
答案 0 :(得分:2)
问题在于您将<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div id="mbody">
<div class="resources">
<ul>
<a href="#">
<li data-color="#380606">Policies</a>
</li>
<a href="#">
<li data-color="#191919">LMS</a>
</li>
<a href="#">
<li data-color="#cbcbcb">Tips & Tricks</a>
</li>
<li data-color="#f08721"><a href="#">Forms</a>
</li>
</ul>
</div>
<div id="mbg"></div>
</div>
声明为featureHistMap
- 请注意您正在将Map[Int, (Int, Long)]
映射到一对Int
。稍后,您尝试从(Int, Long)
中检索一个值,而不是一对Map[Int, Long]
。
您需要将(Int, Long)
的类型重新声明为featureHistMap
,或将Map[Int, Map[Int, Long]]
的类型重新声明为featureHist
。