복붙노트

[HADOOP] combineByKey를 사용하여 출력을 (키, 반복 가능 [값])으로 가져옵니다.

HADOOP

combineByKey를 사용하여 출력을 (키, 반복 가능 [값])으로 가져옵니다.

groupByKey 메서드에서 반환되는 출력과 마찬가지로 RDD (키, 값)를 RDD (키, 반복 가능한 [값])로 변환하려고합니다. 그러나 groupByKey가 효율적이지 않으므로 대신 RDD에서 combineByKey를 사용하려고합니다. 그러나 작동하지 않습니다. 아래는 사용 된 코드입니다.

val data= List("abc,2017-10-04,15.2",
          "abc,2017-10-03,19.67", 
          "abc,2017-10-02,19.8",
          "xyz,2017-10-09,46.9", 
          "xyz,2017-10-08,48.4",
          "xyz,2017-10-07,87.5", 
          "xyz,2017-10-04,83.03", 
          "xyz,2017-10-03,83.41",
          "pqr,2017-09-30,18.18", 
          "pqr,2017-09-27,18.2", 
          "pqr,2017-09-26,19.2", 
          "pqr,2017-09-25,19.47", 
          "abc,2017-07-19,96.60",
          "abc,2017-07-18,91.68", 
          "abc,2017-07-17,91.55")
val rdd = sc.parallelize(templines)
val rows = rdd.map(line => {
  val row = line.split(",")
  ((row(0), row(1)), row(2))
})

// re partition and sort based key    
val op = rows.repartitionAndSortWithinPartitions(new CustomPartitioner(4))
val temp = op.map(f => (f._1._1, (f._1._2, f._2)))

val mergeCombiners = (t1: (String, List[String]), t2: (String, List[String])) => 
    (t1._1 + t2._1, t1._2.++(t2._2))
val mergeValue = (x: (String, List[String]), y: (String, String)) => {
  val a = x._2.+:(y._2)
  (x._1, a)
}

// createCombiner, mergeValue, mergeCombiners
val x = temp.combineByKey(
  (t1: String, t2: String) => (t1, List(t2)),
  mergeValue,
  mergeCombiners)

temp.combineByKey가 컴파일 타임 오류가 발생했습니다. 가져올 수 없습니다.

해결법

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

    1.groupByKey가 제공하는 출력과 비슷한 결과를 얻으려면 groupByKey를 사용해야하며 다른 방법은 사용하지 않아야합니다. reduceByKey, combineByKey 등은 groupByKey를 사용한 다음에 집계를 사용하는 것보다 훨씬 효율적입니다 (다른 groupBy 메소드 중 하나가 제공 할 수있는 것과 동일한 결과를 제공함).

    groupByKey가 제공하는 출력과 비슷한 결과를 얻으려면 groupByKey를 사용해야하며 다른 방법은 사용하지 않아야합니다. reduceByKey, combineByKey 등은 groupByKey를 사용한 다음에 집계를 사용하는 것보다 훨씬 효율적입니다 (다른 groupBy 메소드 중 하나가 제공 할 수있는 것과 동일한 결과를 제공함).

    원하는 결과가 RDD [key, iterable [value]]이므로 직접 목록을 작성하거나 groupByKey를 사용하면 동일한 작업량이 발생합니다. 직접 groupByKey를 다시 구현할 필요가 없습니다. groupByKey의 문제점은 구현이 아니라 분산 아키텍처에 있습니다.

    groupByKey 및 이러한 유형의 최적화에 대한 자세한 내용은 여기를 읽는 것이 좋습니다.

  2. from https://stackoverflow.com/questions/46823362/use-combinebykey-to-get-output-as-key-iterablevalues by cc-by-sa and MIT license