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