복붙노트

[HADOOP] Apache Spark에서 정확한 중간 값을 어떻게 계산합니까?

HADOOP

Apache Spark에서 정확한 중간 값을 어떻게 계산합니까?

이 페이지는 몇 가지 통계 함수 (평균, 표준 편차, 분산 등)를 포함하지만 중앙값을 포함하지 않습니다. 정확한 중앙값은 어떻게 계산합니까?

감사

해결법

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

    1.RDD를 정렬하고 중간 또는 두 요소의 평균에서 요소를 가져와야합니다. 다음은 RDD [Int]의 예입니다.

    RDD를 정렬하고 중간 또는 두 요소의 평균에서 요소를 가져와야합니다. 다음은 RDD [Int]의 예입니다.

      import org.apache.spark.SparkContext._
    
      val rdd: RDD[Int] = ???
    
      val sorted = rdd.sortBy(identity).zipWithIndex().map {
        case (v, idx) => (idx, v)
      }
    
      val count = sorted.count()
    
      val median: Double = if (count % 2 == 0) {
        val l = count / 2 - 1
        val r = l + 1
        (sorted.lookup(l).head + sorted.lookup(r).head).toDouble / 2
      } else sorted.lookup(count / 2).head.toDouble
    
  2. ==============================

    2.Spark 2.0+ 및 DataFrame API를 사용하여 approxQuantile 메서드를 사용할 수 있습니다.

    Spark 2.0+ 및 DataFrame API를 사용하여 approxQuantile 메서드를 사용할 수 있습니다.

    def approxQuantile(col: String, probabilities: Array[Double], relativeError: Double)
    

    또한 Spark 버전 2.2 이후 여러 열에서 동시에 작동합니다. probabilites를 Array (0.5)로 설정하고 relativeError를 0으로 설정하면 정확한 중간 값을 계산합니다. 문서에서 :

    그럼에도 불구하고 relativeError를 0으로 설정할 때 정밀도에 문제가있는 것으로 보입니다. 여기에있는 질문을보십시오. 어떤 경우에는 0에 가까운 낮은 오류가 더 잘 작동합니다 (Spark 버전에 따라 다름).

    1에서 99 사이의 숫자의 중앙값을 계산하고 낮은 relativeError를 사용하는 작은 작업 예제 :

    val df = (0 to 99).toDF("num")
    val median = df.stat.approxQuantile("num", Array(0.5), 0.001)(0)
    println(median)
    

    반환 된 중앙값은 50.0입니다.

  3. from https://stackoverflow.com/questions/28158729/how-can-i-calculate-exact-median-with-apache-spark by cc-by-sa and MIT license