스파크의 구현 randomSplit()
function 의 randomSplit()포함 무게 목록하고 씨앗이 사양에 있습니다. 가중치 목록은 각각의 분할 수와 백분율(대략적인)을 지정하는 것이며 시드는 재현성을위한 것입니다. 비율은 계산 방법의 특성으로 인해 대략적인 것입니다.
예를 들어,다음 코드는 그림 3 분 df 두 가지로 데이터를 프레임,train_df
being80%test_df
being20%의 원본 데이터를 프레임입니다. 를 사용하여 동일한 값은 임의의 씨앗,우리가 기대하는 것과 동일한 데이터 포인트에서 동일한 분할 만약 우리가 다시 실행 스크립트나 스파크 내부적으로 다시 작성됩니다.
후드
다음과 같은 프로세스가 반복을 생성하는 각각의 분할 프레임 데이터 분할,정렬 내에서 파티션,Bernoulli 샘플링입니다. 는 경우 원본 데이터를 프레임은 캐쉬하지 않는 데이터가 다시 가져 다시 분할,그리고 다시 정렬을 위해 각 분할 계산이 됩니다. 이것은 잠재적 인 이상 현상의 근원입니다. 요약하면 randomSplit()은 수행중인 분할과 함께 변경되는 샘플에 대한 백분율로 각 분할에 대해 샘플()을 수행하는 것과 같습니다. PySpark3 에서 randomSplit()에 대한 소스 코드를 검사하면 분명합니다. 이 블로그⁴ 는 또한 randomSplit()이 구현되는 방법에 대한 좀 더 많은 정보와 비주얼을 제공합니다.
예제를 살펴 보겠습니다. 그림 4 는 0.80 분할로 시작하여 각 분할에 대한 샘플()의 다이어그램입니다.
스파크가 Bernoulli 샘플링,로 요약할 수 있는 생성에 대한 임의의 숫자를 항목(데이터 포인트)과 그것을 받아들로 분할하는 경우를 생성된 번호를 특정 범위 내에 있에 의해 결정되는 분할 비율이 있습니다. 0.8 분할 데이터 프레임의 경우 베르누이 셀 샘플러에 대한 수용 범위가 될 것입니다.
수용의 경계만으로 변경되는 그림 5 의 0.20 분할에 대해 동일한 샘플링 프로세스가 뒤 따른다.
데이터 프레임이 파티션 내에서 다시 페치되고,분할되고,다시 정렬됩니다. 예제에서 RDD 파티션이 멱등수라는 것을 알 수 있습니다. 즉,그림 4 의 각 파티션의 데이터 포인트는 그림 5 의 동일한 파티션에 남아 있습니다. 예를 들어,점 b 와 c 는 그림 4 와 5 모두에서 파티션 1 에 있습니다. 또한 각 파티션과 관련된 시드는 항상 일정하게 유지되며 파티션 내의 순서는 동일합니다. 이 세 가지 점은 모두 sample()과 randomSplit()의 기본입니다. 동일한 샘플이 전자의 동일한 시드로 생산되도록하고,후자의 중복 또는 사라지는 데이터 포인트가 없음을 보장합니다.
솔루션을 피하는 불일치
실제로 이러한 문제를 해결에 놓여있는 것을 보장 RDD 파티션 및 정렬 순서는 나무 등. 중 하나를 다음 세 가지 방법을 확인이 적용될 수 있습니다:1)캐시 데이터를 프레임 작업을하기 전에는 2)다시 분할하여 열 또는 집합의 열,그리고 3)사용하여 집계 functions⁵. 각 방법의 예가 그림 6 에 나와 있습니다.
캐싱 원본 데이터를 프레임에 이르게 파티션의 콘텐츠에 개최되는 메모리에 있습니다. 따라서 데이터를 다시 가져 와서 파티셔닝하고 정렬하는 대신 Spark 는 분할 된 데이터를 메모리에 사용하여 작업을 계속합니다. 캐시()는persist(pyspark.StorageLevel.memory_only)
persist(pyspark.StorageLevel.memory_and_disk_only)
사용을 고려할 수 있습니다. 이 없는 경우 메모리나 디스크 공간을 이용,불꽃을 다시 가져오기 및 파티션에서 데이터에 스크래치,그래서 될 수 있는 것이 현명하 모니터링에서 불꽃 Web UI. 캐싱은 필자의 경우 선택한 솔루션입니다.
요약 및 핵심
의 도덕적 이야기는 경우 예기치 않은 행동이 일어나 불꽃에서,당신은 좀 더 심도! 요약하면 다음과 같습니다 모든 주요 포인트의 이 문서에서:
- randomSplit()은 적용하는 것과 동일 샘플()에서 당신의 프레임 데이터를 여러 번,각 샘플을 다시 가져오기,분할,정렬 데이터를 프레임 내에서 파티션이 있습니다.
- 파티션 간 데이터 분포 및 정렬 순서는 randomSplit()및 sample()모두에 중요합니다. 두 경우는 변경에 따라 데이터를 다시 가져올 수있다,중복 또는 누락에서 값 분할과 동일한 샘플을 사용하여 동일한 씨의 다른 결과가 발생할 수 있습니다.
- 이러한 불일치하지 않을 수 있습에서 발생하는 모든 실행하지만,그들을 완전히 제거,지속(aka 캐시)데이터 구조,다시 열에(s),적용 또는 집계와 같은 기능을 groupBy.