2016-07-10 119 views
0

我有一個pairRDD與元組在下面的表格是:轉換的RDD成一個鍵值對RDD,與值列表是

[(1,"b1","c1","d1","e1"), (2,"b2","c2","d2","e2"), ... 

我要的是上述轉換成關鍵 - 值對RDD,其中,所述第一場將是關鍵,和第二場的字符串列表(值)。即我想把它變成下面的形式:

[(1,["b1","c1","d1","e1"]), (2,["b2","c2","d2","e2"]), ... 

在此之後,是否可以訪問我想要的任何字段?

例如,我可以訪問元組(1,["b1","c1","d1","e1"]),然後只提取字段d1

+0

如果你想保存密鑰的順序,這看起來像是一個'HashMap <整數,列表>'或'LinkedHashMap <整數,列表>'。 – Titus

+0

我應該使用rdd.hashMap嗎? – hammad

+0

哦,我誤解了,我以爲你想一個RDD對象轉換爲一個普通的Java對象,作爲一個RDD對象,你可以使用'JavaPairRDD <整數,列表>'。 – Titus

回答

1

如果您有一個帶有元組的RDD,但是元組表示爲,則可以使用mapToPair將元組的RDD轉換爲具有Key和Value的PairRDD作爲首選。

在Java 8,這可能是

JavaPairRDD<Integer,List<String>> r = 
    rddOfTuples.mapToPair((t)->new Tuple2(
     extractKey(t), 
     extractTuples(t) 
)); 

注意,該操作將引入洗牌。

爲了說明明顯,extractKeyextractTuples是要實現的方法,根據需要提取原始元組的部分。

用我有限的斯卡拉元組的知識,並假設輸入是像scala.Tuple5<String,Integer,Integer,Integer,Integer>,這可能是:

JavaPairRDD<Integer,List<String>> r = 
    rddOfTuples.mapToPair((t)->new Tuple2(
     t._1, 
     Arrays.asList(t._2,t._3,t._4,t._6) 
)); 

但是,如果你不知道事先元數的Tuple的(元素的數量) ,然後以斯卡拉術語來說,它是Product。要動態地訪問你的元素,你將需要使用Product接口,以供您選擇:

  • int productArity()
  • Object productElement(int n)
  • Iterator<Object> productIterator()

然後它變成一個常規的Java練習:

JavaPairRDD<Integer,List<String>> r = 
    rddOfTuples.mapToPair((t)->{ 
    List<String> l = new ArrayList<>(t.productArity()-1); 
    for (int i = 1; i < t.productArity(); i++) { 
     l.set(i-1,t.productElement(i)); 
    } 
    return new Tuple2<>(t._1,l); 
    })); 

我希望我有這一切的權利......上面這段代碼是未經測試/未編譯的......所以,如果你能得到它與修正工作,然後隨意在這個答案申請更正...

+0

但這裏的問題是,我想要的值作爲列表 – hammad

+0

意味着元組ll將被定義爲(1,[「hh」,「gg」,「hh」]),這裏代表您將修改您的密鑰 – hammad

+0

代碼請告訴我該怎麼做? – hammad

1

你可以嘗試使用地圖函數,如在斯卡拉:

rdd.map { case (k,v1,v2,v3,v4) => (k,(v1,v2,v3,v4)) } 

或rdd.groupBy也可以使用,但這可能是大型數據集效率低下。

+0

我正在使用java – hammad

+0

我怎麼能在java中做到這一點 – hammad

+0

我不熟悉在Java中使用Spark,但這段代碼可能有所幫助:http:// www.programcreek.com/java-api-examples/index.php?source_dir=oryx-master/app/oryx-app-mllib/src/main/java/com/cloudera/oryx/app/batch/mllib/als/ Evaluation.java - 您可以創建一個將Tuple5 <整數,字符串,字符串,字符串,字符串>作爲輸入的函數,並返回一個Tuple2 <整數,列表> –