[英]Apache spark : JavaPairRDD Cogroup function gives wrappers$iterable, how to traverse it?
我正在使用Apache Spark 1.1.0。 在實現期間,我在JavaPairRDD<String, SomeClassObjects>
上調用JavaPairRDD<String, SomeClassObjects>
。
JavaPairRDD返回的結果采用<String, wrappers$iterable>
。
有誰知道如何在Java中迭代wrappers$iterable
? 我嘗試將其強制轉換為Iterable或JavaIterableWrapperSerializer,但它們都拋出ClassCastException。
代碼是:
JavaPairRDD mtPairRDD的結果類型為Tuple2<String, ClassMTObj>
JavaPairRDD mcPairRDD的結果類型為Tuple2<String,ClassMCObj>
JavaPairRDD mCmTPairRDD = mcPairRDD.cogroup(mtPairRDD, 100);
List lst = mCmTPairRDD.collect()
for(int i=0;i <= lst2.size(); i++) {
Tuple2 obj1 = (Tuple2) lst2.get(i);
String mCompId = (String) obj1._1();
Tuple2 obj2 = (Tuple2) obj1._2();
ClassMCObj mcBean = (ClassMCObj) obj2._1(); //ClassCastException:due to wrappers$iterable
ClassMTObj mcT = (ClassMTObj) obj2._2(); //ClassCastException:due to wrappers$iterable
}
我已經嘗試過鑄造
Iterable mcBean = (Iterable) obj2._1()
要么
JavaIterableWrapperSerializer mcBean = (JavaIterableWrapperSerializer) obj2._1();
但是所有類型轉換選項都將引發Exception。
謝謝你,尼丁
如果您不使用原始類型JavaPairRDD
和List
,則編譯器可以幫助您找到真正的問題。 您正在將對象轉換為錯誤的類型。 這是我對您代碼的修正:
JavaPairRDD<String, Tuple2<String, ClassMTObj>> mcPairRDD = null;
JavaPairRDD<String, Tuple2<String, ClassMCObj>> mtPairRDD = null;
JavaPairRDD<String, Tuple2<Iterable<Tuple2<String, ClassMTObj>>, Iterable<Tuple2<String, ClassMCObj>>>> mCmTPairRDD
= mcPairRDD.cogroup(mtPairRDD, 100);
List<Tuple2<String, Tuple2<Iterable<Tuple2<String, ClassMTObj>>, Iterable<Tuple2<String, ClassMCObj>>>>> lst = mCmTPairRDD.collect();
for (Tuple2<String, Tuple2<Iterable<Tuple2<String, ClassMTObj>>, Iterable<Tuple2<String, ClassMCObj>>>> kv : lst) {
String key = kv._1();
Iterable<Tuple2<String, ClassMTObj>> v1 = kv._2()._1();
Iterable<Tuple2<String, ClassMCObj>> v2 = kv._2()._2();
for (Tuple2<String, ClassMTObj> kv1 : v1) {
//...
}
for (Tuple2<String, ClassMCObj> kv2 : v2) {
//...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.