2016-06-09 34 views
1

簡單的問題:任何實際上有效的方法來獲得由每個鍵一個鍵值對構成的dstream?僞代碼:Spark Streaming在PairDStream中獲得每個鍵的一個元素

myKeyValueDStream = {(A,miao-1-3), 
(A,miao-2-4), 
(A,miao-5-6), 
(B,bau-1-2), 
(B,bau-3-4), 
(C,cip-1-2), 
(C,cip-3-4)} 
singleLineDStream = myKeyValueDStream.takeOneElementPerKey(); 
//I don't care which one; the first one would be fine 
singleLineDStream.print() // {(A,miao-1-3),(B,bau-1-2),(C,cip-1-2)} 

我的解決方案,現在(道歉的Java 7)的:

JavaPairDstream<String,String[]> singleLineDStream = pairdDstream.reduceByKey(new Function2<String[],String[],String[]>(){ 
     @Override 
     public String[] call(String[] arg0, String[] arg1) throws Exception { 
      return arg0; 
     } 
    }); 

是否有更好的方式,採取一個元素爲每個鍵?使用任何你想要的解決方案的語言。

+1

'reduceByKey'應該要走的路。 – maasg

回答

0

我會信任maasg,說實在的,我給了我的問題的答案:

JavaPairDstream<String,String[]> singleLineDStream = pairdDstream.reduceByKey(new Function2<String[],String[],String[]>(){ 
    @Override 
    public String[] call(String[] arg0, String[] arg1) throws Exception { 
     return arg0; 
    } 
}); 
0

可以做的一件事就是使用RDD上的函數將其用作包含集合中每個鍵的一個值的字典。之後,可以將字典轉換爲具有鍵值對的列表。

在本Pyspark Code Image

+0

這會要求驅動程序收集dstream中的所有數據,其結果有兩點:1)不必要的網絡開銷; 2)驅動程序可能沒有足夠的內存來保存所有數據。如果有一種方法來保持集合的分佈,它應該是首選。 – maasg

相關問題