2016-12-21 1 views
4

mapPartitions을 RDD에 적용하면 파티션에 반복 가능한 개체가 생성됩니다. 그런 다음 mapPartitions 함수 내에서 iterable 객체의 toArray 멤버 함수를 호출하여 반복 가능한 객체를 Array 객체로 변환합니다. toArray을 호출하는 것은 복사를 포함합니까, 아니면 그냥 배열과 같은 메모리 부분을 참조하기 시작합니까? 복사가 필요한 경우 복사를 방지하는 방법은 무엇입니까?반복 가능한 배열과 스파크의 배열

답변

3

질문에 대한 중요한 수정 - mapPartitions 동안 노출 된 파티션 데이터 구조는 반복기가 아니고 반복 가능합니다.

  • Iterator가 한 번 컬렉션의 각 요소를 방문 허용 next()hasNext() 방법을 가지고 다음은 인터페이스 차이입니다. 반복자의 메서드가 호출되면 마지막 요소는 없어집니다 (변수에 저장하지 않은 경우).
  • Iterable에는 원할 때마다 Iterator을 생성 할 수있는 기능이 있습니다. 이렇게하면 각 요소를 원하는만큼 여러 번 방문 할 수 있습니다.

구현면에서 Iterator은 데이터를 스트리밍 할 수 있습니다. next()이 호출 될 때 실제로로드되는 한 번에 하나의 요소 만 메모리에 있어야합니다. Spark (sc.textFile)을 사용하여 텍스트 파일을 읽는다면 정확하게이 작업을 수행하고 파티션을 통해 간단한 반복 작업을 수행하는 데 거의 메모리를 사용하지 않습니다.

iterator.toArray으로 전화 할 수는 있지만 반드시 원하지 않을 수 있습니다. 결국 모든 데이터를 메모리에 저장하게됩니다 (한번에 한 번에 하나의 요소 만로드 할 수 있기 때문에 Spark에서는 한 번에 모든 요소를로드 할 수 없으며 각 데이터를 복사합니다 (Int과 같은 프리미티브의 경우).) 또는 각 데이터 조각에 대해 새 참조를 할당하십시오 (AnyRef의 경우, Array[_]과 같음). 이 복사를 방지 할 수있는 방법은 없습니다.

파티션 반복자를 배열로 변환하는 작업이 원하는 경우이지만 이러한 사용 사례는 드뭅니다. 메모리가 부족하고 불필요한 할당 및 GC로 인해 응용 프로그램의 실행 속도가 느려질 수 있으므로 실제로 필요한지 여부에 대해 열심히 생각하십시오!

+0

다음 질문은 반복자가 한 번에 하나의 요소가 아닌 특정 수의 요소를 가져올 수 있습니까? – pythonic

+1

이 작업을 수행하기 위해 미리 빌드 할 수있는 것은 없지만 'Iterator 확장'을 작성하고 마지막 'n'요소를 추적 할 수 있습니다. 영감을 얻으 려한다면'iterator.buffered'를 보자 : 다음 요소를 지우지 않고 다음 요소를 들여다 볼 수있는'BufferedIterator'가 생성된다. – Tim

+1

아마도'iterator.grouped (size)'를 원할 것이다. 이것은 당신에게 주어진 크기의'Seq'에 대한 반복자를 줄 것이다. –