그동안 서로간의 변형을 통해서 어떻게 RDD를 생성하는지를 알아보았다. 하지만, 어떤 경우에는 Dataset을 가지고 직접적으로 어떤 일을 하고 싶을 수도 있다. Action은 RDD operation의 두 번째 형태이다. Action은 driver program에 마지막 값을 되돌려 주거나 외부 storage system에 데이터를 쓰는 작업을 수행한다. Action은 RDD를 호출하는 곳에서 필요로 하는 변형에 대해서 평가하기 때문에 실제적인 ouput을 만들어낼 필요가 있다.
앞의 섹션의 log example에서 계속해서 살펴보자면 badLinesRDD에 대해 어떤 정보를 출력하고 싶을 수도 있다. 그렇게 하기 위해서는 2가지 action을 사용할 수 있다. count()는 숫자를 센 값을 리턴하고, take()는 RDD의 element collection을 리턴한다. 샘플코드는 3-15, 3-17에서 볼 수 있다.
Example 3-15. Python error count using actions
print "Input had " + badLinesRDD.count() + " concerning lines"
print "Here are 10 examples: "
for line in badLinesRDD.take(10):
print line
Example 3-16. Scala rror count using actions
println("Input had " + badLinesRDD.count() + " concerning lines")
println("Here are 10 examples:")
badLinesRDD.take(10).foreach(println)
Example 3-17. Java error count using actions
System.out.println("Input had " + badLinesRDD.count() + " concerning lines")
System.out.println("Here are 10 examples:")
for (String line : badLinesRDD.take(10)) {
System.out.println(line);
}
위의 예제에서, driver program에서 작은 숫자의 RDD element를 추출하기 위해서 take()를 사용했다. Driver에 정보를 출력하기 위해서 반복하여 출력했다. RDD는 전체 RDD를 추출하기 위해서 collect() 함수를 가지고 있다. 만약 프로그램 필터에서 RDD를 아주 작은 크기로 줄여서 내부적으로 다루고자 하는 경우에 유용하게 사용할 수 있다. 다만, 전체 dataset은 collect()를 사용하여 하나의 machine의 메모리 크기에 적합해야 한다는 것을 유념해야 한다. 따라서 collect()는 large dataset을 대상으로는 사용하지 않아야 한다.
대부분의 경우, RDD는 driver에 직접적으로 collect()함수를 사용하여 데이터를 추출할 수 없다. 왜냐하면 dataset이 너무 크기 때문이다. 이러한 경우에는 HDFS나 Amazon S3와 같은 분산 저장환경에 데이터를 쓰는 경우가 일반적이다. 또한 saveAsTextFile() action, saveAsSequenceFile()이나 다양한 내장된 형태로 다른 많은 action을 사용하여 RDD의 내용을 저장할 수 있다. 데이터를 추출하는 다른 option에 대해서는 Chapter 5에서 다룰 것이다.
새로운 action을 매번 호출할 때마다 전체 RDD가 "맨 처음부터"(from scratch) 계산되어야 한다는 것을 아는 것이 중요하다. 이러한 비효율성을 피하기 위해서 44페이지에서 "Persistence (Caching)"으로 다루는 중간 결과를 유지할 수 있다.
댓글을 달아 주세요
댓글 RSS 주소 : http://www.yongbi.net/rss/comment/743