[HADOOP] ReduceByKey를 사용하여 값 목록 그룹화
HADOOPReduceByKey를 사용하여 값 목록 그룹화
키당 값 목록을 그룹화하고 다음과 같은 작업을 수행했습니다.
sc.parallelize(Array(("red", "zero"), ("yellow", "one"), ("red", "two"))).groupByKey().collect.foreach(println)
(red,CompactBuffer(zero, two))
(yellow,CompactBuffer(one))
그러나 Databricks에서 블로그 게시물을 발견했으며 큰 데이터 세트에 groupByKey를 사용하지 않는 것이 좋습니다.
GroupByKey 피하기
reduceByKey를 사용하여 동일한 결과를 얻을 수있는 방법이 있습니까?
나는 이것을 시도했지만 모든 값을 연결했다. 그건 그렇고, 내 경우에는 키와 값 모두 문자열 타입이다.
sc.parallelize(Array(("red", "zero"), ("yellow", "one"), ("red", "two"))).reduceByKey(_ ++ _).collect.foreach(println)
(red,zerotwo)
(yellow,one)
해결법
-
==============================
1.aggregateByKey 사용 :
aggregateByKey 사용 :
sc.parallelize(Array(("red", "zero"), ("yellow", "one"), ("red", "two"))) .aggregateByKey(ListBuffer.empty[String])( (numList, num) => {numList += num; numList}, (numList1, numList2) => {numList1.appendAll(numList2); numList1}) .mapValues(_.toList) .collect() scala> Array[(String, List[String])] = Array((yellow,List(one)), (red,List(zero, two)))
가변적 인 데이터 세트 ListBuffer를 사용하는 이유에 대한이 링크 인 aggregateByKey에 대한 자세한 내용은이 답변을 참조하십시오.
편집하다:
reduceByKey를 사용하여 동일한 결과를 얻을 수있는 방법이 있습니까?
위의 내용은 실제로 성능이 더 나쁩니다. 자세한 내용은 @ zero323의 주석을 참조하십시오.
-
==============================
2.
sc.parallelize(Array(("red", "zero"), ("yellow", "one"), ("red", "two"))) .map(t => (t._1,List(t._2))) .reduceByKey(_:::_) .collect()
Array[(String, List[String])] = Array((red,List(zero, two)), (yellow,List(one)))
from https://stackoverflow.com/questions/37580303/using-reducebykey-to-group-list-of-values by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 모든 쿼리에 대해 빈 결과 집합을 반환하는 하이브 테이블 (0) | 2019.06.27 |
---|---|
[HADOOP] Spark를 사용하여 디렉토리에서 여러 파일 읽기 (0) | 2019.06.27 |
[HADOOP] Windows에서 Hadoop 빌드 실패 : native.sln에서 zconf.h가 누락 되었습니까? (0) | 2019.06.27 |
[HADOOP] 내 시퀀스 파일이 내 하프 매퍼 클래스에서 두 번 읽히는 이유는 무엇입니까? (0) | 2019.06.27 |
[HADOOP] 오라클에서 BLOB (이미지)를 하이브로 가져 오기 (0) | 2019.06.27 |