2016-06-09 2 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)} 

지금 (자바 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

에서와 마찬가지로

:

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

할 수있는 일은 CollectAsMap 기능을 RDD에서 사용하여 세트의 각 키에 대해 하나의 값을 포함하는 사전으로 사용하는 것입니다. 그런 다음 사전을 키 - 값 쌍이있는 목록으로 변환 할 수 있습니다. 내가 maasg을 신뢰하고 실제로, 나는 내 질문에 대답을 준 말할 것이다이 Pyspark Code Image

+0

은 dstream의 모든 데이터가 드라이버에서 수집되어야한다는 두 가지 결과를 요구합니다. 1) 불필요한 네트워크 오버 헤드. 2) 드라이버가 모든 데이터를 저장할 충분한 메모리가 없을 수 있습니다. 컬렉션을 분산 된 상태로 유지하는 방법이 있다면 선호해야합니다. – maasg