스파크 후드:randomSplit()및 샘플()내부 동작

스파크의 구현 randomSplit()

function 의 randomSplit()포함 무게 목록하고 씨앗이 사양에 있습니다. 가중치 목록은 각각의 분할 수와 백분율(대략적인)을 지정하는 것이며 시드는 재현성을위한 것입니다. 비율은 계산 방법의 특성으로 인해 대략적인 것입니다.

예를 들어,다음 코드는 그림 3 분 df 두 가지로 데이터를 프레임,train_dfbeing80%test_dfbeing20%의 원본 데이터를 프레임입니다. 를 사용하여 동일한 값은 임의의 씨앗,우리가 기대하는 것과 동일한 데이터 포인트에서 동일한 분할 만약 우리가 다시 실행 스크립트나 스파크 내부적으로 다시 작성됩니다.

그림 3: randomSplit()function 예

후드

다음과 같은 프로세스가 반복을 생성하는 각각의 분할 프레임 데이터 분할,정렬 내에서 파티션,Bernoulli 샘플링입니다. 는 경우 원본 데이터를 프레임은 캐쉬하지 않는 데이터가 다시 가져 다시 분할,그리고 다시 정렬을 위해 각 분할 계산이 됩니다. 이것은 잠재적 인 이상 현상의 근원입니다. 요약하면 randomSplit()은 수행중인 분할과 함께 변경되는 샘플에 대한 백분율로 각 분할에 대해 샘플()을 수행하는 것과 같습니다. PySpark3 에서 randomSplit()에 대한 소스 코드를 검사하면 분명합니다. 이 블로그⁴ 는 또한 randomSplit()이 구현되는 방법에 대한 좀 더 많은 정보와 비주얼을 제공합니다.

예제를 살펴 보겠습니다. 그림 4 는 0.80 분할로 시작하여 각 분할에 대한 샘플()의 다이어그램입니다.

숫자 4:프로세스 생성 0.8 분할됩니다. 샘플()구현과 동일합니다.

스파크가 Bernoulli 샘플링,로 요약할 수 있는 생성에 대한 임의의 숫자를 항목(데이터 포인트)과 그것을 받아들로 분할하는 경우를 생성된 번호를 특정 범위 내에 있에 의해 결정되는 분할 비율이 있습니다. 0.8 분할 데이터 프레임의 경우 베르누이 셀 샘플러에 대한 수용 범위가 될 것입니다.

수용의 경계만으로 변경되는 그림 5 의 0.20 분할에 대해 동일한 샘플링 프로세스가 뒤 따른다.

숫자 5:프로세스 생성 0.2 분할됩니다. 샘플()과 동일합니다. 구현. 파티션 내용은 일정하게 유지되며 정렬 순서는 유효한 분할을 보장합니다.

데이터 프레임이 파티션 내에서 다시 페치되고,분할되고,다시 정렬됩니다. 예제에서 RDD 파티션이 멱등수라는 것을 알 수 있습니다. 즉,그림 4 의 각 파티션의 데이터 포인트는 그림 5 의 동일한 파티션에 남아 있습니다. 예를 들어,점 b 와 c 는 그림 4 와 5 모두에서 파티션 1 에 있습니다. 또한 각 파티션과 관련된 시드는 항상 일정하게 유지되며 파티션 내의 순서는 동일합니다. 이 세 가지 점은 모두 sample()과 randomSplit()의 기본입니다. 동일한 샘플이 전자의 동일한 시드로 생산되도록하고,후자의 중복 또는 사라지는 데이터 포인트가 없음을 보장합니다.

솔루션을 피하는 불일치

실제로 이러한 문제를 해결에 놓여있는 것을 보장 RDD 파티션 및 정렬 순서는 나무 등. 중 하나를 다음 세 가지 방법을 확인이 적용될 수 있습니다:1)캐시 데이터를 프레임 작업을하기 전에는 2)다시 분할하여 열 또는 집합의 열,그리고 3)사용하여 집계 functions⁵. 각 방법의 예가 그림 6 에 나와 있습니다.

그림 6: 세 가지 다른 방법을 피하는 불일치에 randomSplit()및 샘플()

캐싱 원본 데이터를 프레임에 이르게 파티션의 콘텐츠에 개최되는 메모리에 있습니다. 따라서 데이터를 다시 가져 와서 파티셔닝하고 정렬하는 대신 Spark 는 분할 된 데이터를 메모리에 사용하여 작업을 계속합니다. 캐시()는persist(pyspark.StorageLevel.memory_only)persist(pyspark.StorageLevel.memory_and_disk_only)사용을 고려할 수 있습니다. 이 없는 경우 메모리나 디스크 공간을 이용,불꽃을 다시 가져오기 및 파티션에서 데이터에 스크래치,그래서 될 수 있는 것이 현명하 모니터링에서 불꽃 Web UI. 캐싱은 필자의 경우 선택한 솔루션입니다.

요약 및 핵심

의 도덕적 이야기는 경우 예기치 않은 행동이 일어나 불꽃에서,당신은 좀 더 심도! 요약하면 다음과 같습니다 모든 주요 포인트의 이 문서에서:

  • randomSplit()은 적용하는 것과 동일 샘플()에서 당신의 프레임 데이터를 여러 번,각 샘플을 다시 가져오기,분할,정렬 데이터를 프레임 내에서 파티션이 있습니다.
  • 파티션 간 데이터 분포 및 정렬 순서는 randomSplit()및 sample()모두에 중요합니다. 두 경우는 변경에 따라 데이터를 다시 가져올 수있다,중복 또는 누락에서 값 분할과 동일한 샘플을 사용하여 동일한 씨의 다른 결과가 발생할 수 있습니다.
  • 이러한 불일치하지 않을 수 있습에서 발생하는 모든 실행하지만,그들을 완전히 제거,지속(aka 캐시)데이터 구조,다시 열에(s),적용 또는 집계와 같은 기능을 groupBy.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다