如何编写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 应用程序的文件大小?

如何在scala中使用单片机减少样板

hadoop map 中的全局值减少

从未为大数据创建的 Hadoop 减少输出文件

intellij idea 怎么编写python程序打包发送到spark

Scala将Map序列减少为每个键都有最大值的Map