如何编写hadoop map减少scala中的程序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何编写hadoop map减少scala中的程序相关的知识,希望对你有一定的参考价值。
我正在写一个地图减少应用程序scala。直到地图功能一切正常。但在编写减速机的同时我遇到了问题。
override def reduce(key: Text, values: java.lang.Iterable[Text],
context: ReducerContext) {
}
ReducerContext
被定义为指向上下文内部类,所以我在这里很好。
问题在于Iterable
(Java)组件。我无法遍历它。我明白,首先我将它转换为scala Iterable
然后迭代它,我也做了但仍然没有得到结果。
我已经尝试了scala.collection.JavaConverters._和JavaConversions._这里有几个没有工作的scanarios
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
}
类似地,我尝试将此迭代器转换为列表/数组,但都是徒劳的。一旦我将其转换为list / arrray(toList / tiArray),结果列表/数组的大小就变为0.无论我做什么都不能彻底迭代
我很感激任何帮助。
谢谢
您可以导入JavaConversions
自动转换Iterable
。
import scala.collection.JavaConversions._
如果您还有任何问题,可以粘贴代码吗?
你在values
收到的reduce
的棘手的事情是它只能被遍历一次。 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
的内容将会改变,但引用是相同的。所以不要试图在value
中保存Collection
,否则你会得到一个所有项目相同的Collection
。
以上是关于如何编写hadoop map减少scala中的程序的主要内容,如果未能解决你的问题,请参考以下文章
如何减少 android 的 scala 应用程序的文件大小?