Reducedbykey, groupbykey, Aggregatebykey, 그리고 combinbykey의 차이점을 설명할 수 있는 사람 있나요? 이와 관련된 문서를 읽었는데, 정확한 차이를 이해할 수 없나요?
예를 들어 설명해주시면 좋을 것 같습니다.
groupByKey:
Syntax:
sparkContext.textFile("hdfs://")
.flatMap(line => line.split(" ") )
.map(word => (word,1))
.groupByKey()
.map((x,y) => (x,sum(y)))
groupByKey 일으킬 수 있는 디스크로 데이터 전송 네트워크를 통해 수집 줄이기 위한 노동자입니다.
reduceByKey:
Syntax:
sparkContext.textFile("hdfs://")
.flatMap(line => line.split(" "))
.map(word => (word,1))
.reduceByKey((x,y)=> (x+y))
데이 결합되어서 각 파티션,하나의 산출에 대한 열쇠 중 하나에서 각 파티션을 보내 네트워크를 통해. reduceByKey 필요한 모든 값을 다른 값과 동일한 유형입니다.
aggregateByKey:
과 같 reduceByKey,소요되는 초기 값입니다.
3 매개 변수 입력 i. 초기 값 ii. 혼합기 로직 iii. 순 op 로직
예시:
val keysWithValuesList = Array("foo=A", "foo=A", "foo=A", "foo=A", "foo=B", "bar=C", "bar=D", "bar=D")
val data = sc.parallelize(keysWithValuesList)
//Create key value pairs
val kv = data.map(_.split("=")).map(v => (v(0), v(1))).cache()
val initialCount = 0;
val addToCounts = (n: Int, v: String) => n + 1
val sumPartitionCounts = (p1: Int, p2: Int) => p1 + p2
val countByKey = kv.aggregateByKey(initialCount)(addToCounts, sumPartitionCounts)
ouput: 집계하여 키 합 결과 bar->3 foo->5
combineByKey:
3 매개 변수 입력
예시:
val result = rdd.combineByKey(
(v) => (v,1),
( (acc:(Int,Int),v) => acc._1 +v , acc._2 +1 ) ,
( acc1:(Int,Int),acc2:(Int,Int) => (acc1._1+acc2._1) , (acc1._2+acc2._2))
).map( { case (k,v) => (k,v._1/v._2.toDouble) })
result.collect.foreach(println)
reduceByKey,aggregateByKey,combineByKey선호groupByKey
참조: 피 groupByKey
reducebykey와 groupbykey 둘 다 같은 답을 만들지만, reduceByKey 예제는 대규모 데이터 집합에서 훨씬 더 잘 작동합니다. 그것's Spark가 출력을 각각에 대한 공통 키와 결합할 수 있다는 것을 알기 때문입니다. 데이터를 섞기 전에 파티션을 분할합니다.
반면에 groupByKey를 호출할 때 - 모든 키-값 쌍 이(가) 뒤섞여 있습니다. 이건 존재하지 않는 수많은 데이터야 네트워크를 통해 전송되었습니다.
자세한 내용은 아래 링크를 확인하십시오.
**참고:*** 한 가지 유사점은 모두 광범위한 작업이라는 것입니다.
모두 비록 그들이 가져올 동일한 결과,중요한 차이가 있의 성능에 모두 기능이 있다.reduceByKey()
더 나은 작품과 데이터 집합이 큰 비교했을 때groupByKey()
.
에서reduceByKey()
,쌍에 같은 컴퓨터와 동일한 열쇠가 결합(사용하여 기능으로 전달reduceByKey()
)하기 전에 데이터를 섞는다. 다음의 함수를 다시 호출을 감소하는 모든 값에서 각 파티션을 생성 중 하나는 최종 결과입니다.
에서groupByKey()
,모든 키 값 쌍으로 섞는다. 이것은 많은 불필요한 데이터를 전송되는 네트워크를 통해.
ReduceByKey 'ReduceByKey(펑크, [numTasks])`-
각 파티션에서 각 키에 대해 하나 이상의 값이 있어야 하도록 데이터가 결합됩니다. 그런 다음 셔플이 발생하고 reduce와 같은 작업을 위해 네트워크를 통해 특정 실행자에게 전송됩니다.
GroupByKey - 'groupByKey([numTasks])'`
키에 대한 값을 병합하지 않지만 직접 셔플 프로세스가 발생합니다. 여기서 많은 데이터가 각 파티션으로 전송됩니다. 이는 초기 데이터와 거의 유사합니다.
그리고 각 키의 값 병합은 셔플 후에 이루어집니다. 여기서 최종 작업자 노드에 저장된 많은 데이터가 메모리 부족 문제를 일으킵니다.
AggregateByKey - 'aggregateByKey(0Value)(seqOp, combOp, [numTasks])` reduceByKey와 유사하지만 집계를 수행할 때 초기 값을 제공할 수 있습니다.
reduceByKey 사용
reduceByKey는 대용량 데이터 세트에서 실행할 때 사용할 수 있습니다.
입력 및 출력 값 유형이 동일한 경우 'reduceByKey' AggregateByKey를 넘어서
또 groupByKey를 사용하지 말고 reduceByKey를 선호할 것을 권고했다. 자세한 내용은 여기를 참조하십시오.
또한 이 질문을 참조하여 'ReduceByKey' 및 'aggregateByKey'에 대한 자세한 내용을 파악할 수 있습니다.
그 외에도 이러한 4,리
foldByKey 같은 reduceByKey 그러나 사용자와 정의된 제로 값입니다.
AggregateByKey3 매개 변수를 입력으로 사용하여 2 개의 기능에 대한 합병(중 하나를 병합하는에서 같은 파티션과 다른 병합하는 값에서 파티션입니다. 첫 번째 매개 변수는 ZeroValue)
반면
ReduceBykey1 매개 변수만는 기능이다.
CombineByKey3 매개변수 및 모든 3 는 기능입니다. 비슷한 aggregateBykey 를 제외하고 그것을 할 수있는 기능을 ZeroValue.
GroupByKey 지 않 매개변수와 그룹이다. 또한,그것은 오버헤드를 위한 데이터 전송을 통해 파티션이 있습니다.