Spark의 Random Sampling에 대하여

데이터를 분석하다보면 임의의 샘플을 추출해야 하는 상황이 생깁니다. 그래서 이번에는 Spark에서 랜덤 샘플링을 하는 방법에 대해 정리해보았습니다.

Sample()

Spark RDD API 에는 다양한 sampling 메서드가 존재합니다. 그 중에서 가장 기본이 되는 sample()에 대해 먼저 알아보겠습니다.

# sample(boolean withReplacement, double fraction, long seed)
val rdd = sc.parallelize(1 to 10000, 3)
rdd.sample(false, 0.1, 0).count

첫 번째 인자는 추출 방식을 결정합니다. True면 복원추출, False면 비복원추출 을 실행합니다. 여기에서 말하는 복원추출이란, 한 번 뽑은 것을 다시 뽑을 수 있게 하는 방법을 말합니다. 세 번째 인자로 시드 변수를 지정할 수 있습니다. 시드란, 컴퓨터가 난수를 일정하게 생성하지 않도록 변화를 주는 값을 말합니다.

takeSample()

takeSample()도 랜덤 샘플링을 지원하는 메서드지만, 위와 조금 다른 점이 있습니다.

# takeSample(boolean withReplacement, int num, long seed)
val rdd = sc.parallelize(1 to 1000, 3)
rdd.takeSample(false, 100, 1)

takeSample()은 두 번째 인자를 지정하여 몇 개를 추출할 것인지 정할 수 있습니다. 하지만, 결과 값이 RDD가 아닌 리스트나 배열이기 때문에 메모리에 주의 해야 합니다. 정리하자면, 크기를 정해놓고 샘플을 추출하고자 한다면 takeSample() 메서드가 적합하고 메모리를 생각해서 작은 값을 추출할 때 사용하는 것이 좋습니다.

이외에도 sampleByKey, sampleByKeyExtract 메서드가 존재합니다.

Reference