2017-12-18 18 views
1

작업 : RDD[Int]의 거대한 정렬되지 않은 입력 데이터 세트가있는 경우 상위 10 %를 다른 RDD[Int]으로 반환하십시오.Spark에서 다른 RDD로 정렬되지 않은 RDD의 상위 10 %를 반환하는 효율적인 방법은 무엇입니까?

출력 유형이 RDD[Int] 인 이유는 무엇입니까? 심지어 상위 10 %의 출력 및 배기 드라이버 메모리에 "수집"될대로 내가

sc.makeRDD(input.top(0.1 * input.count())) 

호출 할 수있는 이유는 메모리에 맞지 않게 입력이 너무 커서 때문이다.

이 문제는 보통 입력을 모두 입력으로 정렬 한 다음 어떤 종류의 limit()을 호출하여 처리합니다. 그러나이 경우 실제로는 비효율적이됩니다.

  • 적어도 두 번 이상 전체 데이터 집합이 만들어집니다. (하나는 데이터 집합의 크기를 가져오고 나머지는 정렬/...을 포함합니다.)
  • 저는 실제로 상위 10 %에 관심이 있으며 나머지 90 %에는 관심이 없습니다.

효율적인 대안이 있습니까?

+1

상위 10 % 기준으로 주문 유형이있는 것 같습니다. 그렇다면 최선의 방법은 모든 것을 정렬 한 다음 '제한'을 사용하는 것입니다. 그렇지 않으면 어떤 데이터가 상위 10 %에 있는지 어떻게 알 수 있습니까? – Shaido

+0

@Shaido, 당연히 종류와 관련된'Ordering'이 있습니다. –

+1

이것은 의미가 없습니다. 당신은 어떤 종류의'주문 (Ordering) '을 원하지만 아직 정렬되지 않은 RDD가 있습니다. 왜 샘플을 샘플링합니까? – eliasah

답변

1

approxQuantile이 당신을 위해 일할 수 있으며, 허용 가능한 오류를 알려줍니다.

rdd.toDF("num").approxQuantile("num", Seq(0.1), 0.05).rdd 

위의 rdd에있는 항목은 대략 상위 10 %에 5 % 오류가 있습니다.

+0

감사합니다. @ayplam! 'approxQuantile'의 공간/시간 복잡성의 효율성은 무엇입니까? –

+1

@ K.Chen'O (log (xN))'여기서 x는 근사치 (0.1)입니다. – philantrovert