簡體   English   中英

如何在scala中編寫hadoop map reduce程序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM