2015-01-27 2 views
0

나는 형태 I가 각 인덱스 (IDX1, idx2,이 배열에서 상위 10과 하단 (10 개) 요소를 얻으려면색인 현명한 가장 자주 발생하는 요소

val array: Array[(Int, (String, Int))] = Array(
    (idx1,(word1,count1)), 
    (idx2,(word2,count2)), 
    (idx1,(word1,count1)), 
    (idx3,(word3,count1)), 
    (idx4,(word4,count4))) 

의 배열을 가지고 ....). 기본적으로 각 인덱스 값에 대해 가장 많이 발생하는 상위 10 개 요소와 하위 10 개 하위 요소를 원합니다.

가장 효과적인 방법으로 스파크를 발산하는 방법을 제안하십시오. 각 인덱스에 대해 for 루프를 사용하여 시도했지만 프로그램이 너무 느려지고 순차적으로 실행됩니다.

(0,("apple",1)) 
(0,("peas",2)) 
(0,("banana",4)) 

(1,("peas",2)) 
(1,("banana",1)) 
(1,("apple",3)) 

(2,("NY",3)) 
(2,("London",5)) 
(2,("Zurich",6)) 

(3,("45",1)) 
(3,("34",4)) 
(3,("45",6)) 


Suppose I do top 2 on this set output would be 

    (0,("banana",4)) 
    (0,("peas",2)) 

    (1,("apple",3)) 
    (1,("peas",2)) 

    (2,("Zurich",6)) 
    (2,("London",5)) 

    (3,("45",6)) 
    (3,("34",4)) 

나는 또한 같은 방식으로 스파크에 대한

+0

내가 원하는 것은 분명하지 않습니다. 두 개의 항목이 있습니다 (idx1, (word1, count1)). idx1의 요소를 계산할 때 이들을 (word1, count1 * 2)로 병합합니까? 입력과 출력의 구체적인 예가 도움이 될 것입니다. –

+0

@Paul ... 입력과 출력에 대한 예제로 내 질문을 편집했습니다. –

+0

그리고 그에 따라 대답을 수정했습니다. –

답변

0

확실하지 바닥이 필요하지만, 난 당신과 같이 갈 수 있다고 생각 :

def f(array: Array[(Int, (String, Int))], n:Int) = 
    array.groupBy(_._1) 
    .map(pair => (
      pair._1, 
      pair._2.sortBy(_._2).toList 
     ) 
    ) 
    .map(pair => (
      pair._1, 
      (
       pair._2.take(Math.min(n, pair._2.size)),   
       pair._2.drop(Math.max(0, pair._2.size - n)) 
      ) 
     ) 
    ) 

예는이 될 것이다

groupBy는 frequenct로 정렬 된 항목 목록에 인덱스 맵을 반환합니다. 그런 다음이 엔트리를 상위 n 개 요소가 포함 된 목록과 하위 n 개 요소가 포함 된 목록의 쌍으로 매핑합니다. 명명 된 모든 매개 변수를 _으로 바꿀 수 있다는 점에 유의하십시오. 명확하게하기 위해이 매개 변수를 사용했습니다.

이 버전에서는 항상 맨 위 요소와 bot n 요소를 모두 계산하는 것에 관심이 있다고 가정하고이 두 가지를 모두 한 번에 수행합니다. 대개 둘 중 하나만 필요하면 toList 또는 .drop을 toList 바로 뒤에 추가하는 것이 더 효율적입니다.

+1

OP가 원하는 것은 수행하지 않습니다 (완전히 명확하지는 않지만). 필요한 것은 각 단어의 최상위 및 최하위 10 단어가 아니라 가장 많은 단어가 포함 된 10 개의 색인입니다. –

+0

고쳐졌습니다. 감사. –

+0

'sortBy (entry => entry._2._2)' – user5102379

0

이것은 (K, V) 쌍의 groupByKey를 사용하여 전체 열 목록을 생성 한 다음 정렬 작업을 수행하는 것과 같습니다. 작동이 올바르지 만 일반적인 스파크 환경에서는 groupByKey 작업에 많은 셔플 출력이 포함되며 이는 비효율적 인 작동으로 이어질 수 있습니다.

+1

이 질문에 대한 답을 제공하지 않습니다. 비평하거나 저자의 설명을 요청하려면 게시물 아래에 의견을 남기십시오. 자신의 게시물에 언제나 댓글을 달 수 있으며 충분한 [평판] (http://stackoverflow.com/help/whats-reputation)을 갖게되면 [모든 게시물에 댓글을 달 수] 있어야합니다 (http://stackoverflow.com/help/privileges/comment). – jmoerdyk

+0

덕분에 @jmoerdyk는이를 염두에 두었습니다. –

관련 문제