복붙노트

[SCALA] 스파크 RDD의 배 방법의 설명

SCALA

스파크 RDD의 배 방법의 설명

나는 사전 구축 하둡 - 2.4 (로컬 모드)에 대한 스파크-1.4.0가 DoubleRDD의 제곱의 합을 계산하기 위해 실행하고 있습니다. 내 스칼라 코드를 보이는 등

sc.parallelize(Array(2., 3.)).fold(0.0)((p, v) => p+v*v)

그리고 그것은 놀라운 결과 97.0했다.

이 배의 스칼라 버전에 비해 상당히 직관적이다

Array(2., 3.).fold(0.0)((p, v) => p+v*v)

이는 예상 답변을 13.0를 제공합니다.

이 때문에 이해의 부족으로 꽤 가능성이 나는 코드의 일부 까다로운 실수를 한 것 같다. I는 I가 1 파티션의 수를 변경하는 경우, 그렇지 않으면 결과, 파티션 등 그래서 예에 따라 달라질 수 RDD.fold 사용되는 함수 ()가 소통되어야하는 방법에 대해 읽고

sc.parallelize(Array(2., 3.), 1).fold(0.0)((p, v) => p+v*v)

코드는 나에게 내 컴퓨터에 169.0을 줄 것이다!

누군가가 정확히 여기 무슨 일이 일어나고 있는지 설명 할 수 있습니까?

해결법

  1. ==============================

    1.음, 실제로 꽤 잘 공식 문서에 의해 설명되어 있습니다 :

    음, 실제로 꽤 잘 공식 문서에 의해 설명되어 있습니다 :

    단계에 의해 단계에 무슨 일이 일어나고 있는지 시뮬레이션을 시도 할 수 있습니다 무슨 일이 일어나고 있는지 설명하기 :

    val rdd = sc.parallelize(Array(2., 3.))
    
    val byPartition = rdd.mapPartitions(
        iter => Array(iter.fold(0.0)((p, v) => (p +  v * v))).toIterator).collect()
    

    그것은이 Array 우리에게 비슷한 제공 [더블] = 배열 ​​(0.0, 0.0, 0.0, 4.0, 0.0, 0.0, 0.0, 9.0) 및

    byPartition.reduce((p, v) => (p + v * v))
    

    반환 97

    참고로 중요한 것은 결과 파티션이 결합 된 순서에 따라 실행하는 실행과 다를 수 있다는 것입니다.

  2. from https://stackoverflow.com/questions/31476635/explanation-of-fold-method-of-spark-rdd by cc-by-sa and MIT license