[英]how to write hadoop map reduce programs in scala
我正在写一个map reduce应用程序scala。 直到地图功能一切正常。 但是在编写减速器时我遇到了问题。
override def reduce(key: Text, values: java.lang.Iterable[Text],
context: ReducerContext) {
}
ReducerContext
的定义是引用上下文内部类的,因此我在这里很好。
问题在于Iterable
(Java)组件。我无法对其进行迭代。 我知道我首先将其转换为Scala Iterable
,然后对其进行迭代,我也这样做了,但仍然没有得到结果。
我已经尝试了scala.collection.JavaConverters._和JavaConversions._,这是一些无法解决的问题
val jit: java.util.Iterator[Text]= values.iterator()
val abc = JavaConversions.asScalaIterator(jit) /// val abc=jit.asScala
println("size "+ abc.size)// it displays proper size
for(temp <- abc){
///it dosent come inside this loop
}
同样,我尝试将此Iterator转换为列表/数组,但都没有用。 一旦将其转换为list / arrray(toList / tiArray),结果列表/数组的大小将变为0。无论我做什么,我都无法彻底迭代
我对此表示感谢。
谢谢
您可以导入JavaConversions
以自动转换Iterable
。
import scala.collection.JavaConversions._
如果仍有问题,可以粘贴代码吗?
在reduce
收到的values
的棘手的事情是它只能被遍历一次。 abc.size
将遍历values
。 此后, values
无效。
所以正确的代码应该是
// don't use values
for(value <- values) {
// do something
val v = value.toString
// Don't save value, it will be reused. The content of value will be changed but the reference is same.
}
// don't use values
就像我在评论中提到的那样, value
的类型是Text
。 当你穿越values
,含量value
将被改变,但参考是一样的。 因此,请勿尝试在Collection
保存value
,否则您将获得Collection
所有项目都是相同的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.