【问题标题】:how to write hadoop map reduce programs in scala如何在scala中编写hadoop map reduce程序
【发布时间】:2014-03-10 04:41:18
【问题描述】:

我正在编写一个 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
}

同样,我尝试将此迭代器转换为列表/数组,但都是徒劳的。一旦我将其转换为列表/数组(toList/tiArray),结果列表/数组的大小变为 0。 无论我做什么我都无法彻底迭代

感谢您对此提供的任何帮助。

谢谢

【问题讨论】:

    标签: java scala hadoop mapreduce


    【解决方案1】:

    您可以导入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的内容会发生变化,但引用是一样的。所以不要尝试将value 保存在Collection 中,否则你会得到一个Collection,所有的项目都是一样的。

    【讨论】:

    • 你在reducer中收到的values的棘手之处在于它只能被遍历一次。 abc.size 将遍历 values。之后,values 无效。
    • 删除 println("size "+ abc.size)// it displays proper size 应该可以工作。
    猜你喜欢
    • 1970-01-01
    • 2014-03-19
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多