2016-08-12 3 views
1

이 질문에 해당하는 Pyspark : How to get the number of elements in partition?을 찾고 있습니다.각 pyspark RDD 파티션의 요소 수를 카운트

특히, Pyspark RDD 또는 데이터 프레임의 각 파티션에있는 요소 수를 프로그래밍 방식으로 계산하고 싶습니다.이 정보는 Spark Web UI에서 사용할 수 있습니다. 에서

이 시도 결과 I 메모리에 반복자의 내용을 수집하지 않으

df.foreachPartition(lambda iter: sum(1 for _ in iter))

: "AttributeError는 'NoneType'개체가 어떤 속성 '_jvm를'이 없습니다."

답변

4

요청하는 경우 : iterator를 반복하지 않고 반복기의 요소 수를 얻을 수 있습니까? 대답은 No입니다.

그러나 우리는 당신이 언급 한 게시물로, 메모리에 저장할 필요가 없습니다 : 코드는 단지 솔루션에 매우 가까이

def count_in_a_partition(idx, iterator): 
    count = 0 
    for _ in iterator: 
    count += 1 
    return idx, count 

data = sc.parallelize([ 
    1, 2, 3, 4 
], 4) 

data.mapPartitionsWithIndex(count_in_a_partition).collect() 

편집

mapPartitions은 반복자를 반환해야합니다.

def count_in_a_partition(iterator): 
    yield sum(1 for _ in iterator) 

data.mapPartitions(count_in_a_partition).collect() 
+0

감사합니다. @ShuaiYuan. 아니요, 계산을 위해 반복해야한다는 것을 알고 있습니다. 첫 번째 솔루션이 저에게 효과적입니다! 그러나 두 번째 방법은 Spark 1.5.0 (조직의 클러스터)에서 원래 시도했던 것과 동일한 AttributeError를 던지며, 예제에서 만든 "데이터"rdd에서도 마찬가지입니다. AttributeError : 'NoneType'객체에 '_jvm'속성이 없습니다. 그러나 1.6.0 또는 1.5.2를 실행하는 Spark Community Edition에서는 두 가지 솔루션이 모두 작동합니다. 아마도 내 로컬 CDH 배포판에 이상한 점이 있을까요? –

+0

수 있습니다. 불행히도 Spark 1.5.0을 테스트 할 필요가 없습니다. – ShuaiYuan