2016-06-03 4 views
2

스칼라의 "each"및 "_"표기법과 혼동합니다. 나는이 목록의 각 요소에 대해 예를 들어스칼라 표기법과 혼동 됨

val school = list.map(each=>((each.school,each.payment),each.amount)) 
      .reduceByKey(_+_) 
      .map(each=>(each._1,each._2)) 

을 읽었는데, 그것은 학교, 지불 금액을 소요하고,지도 키로 학교 및 지불을 유지하여 물건의 종류를 줄일 않습니다.

이 줄을

.MAP합니까 (각 => (each._1을 each._2))를 한 번 reducebykey 작업이 완료

해석, 그것은 학교를 다시 매핑하고, 학교에 혼자있는 금액.

제 이해를 명확히합니다.

.map(myTuple => (myTuple._1, myTuple._2)) 

더 중요한 것은 - 마지막 매핑이 실제로 아무것도하지 않습니다 것을 : 그러나 당신이 좋아하는 당신이 그것을 이름을 지정할 수 있습니다 -

답변

4

첫째, each 그냥 변수 이름입니다. 왜? 각 reduceByKey 결과는 일부 유형의 KV의 유형 (K, V)이 있기 때문에 - 튜플의 수집, 당신은 each라는 이름의 2 튜플에 대한 (each._1, each._2)를 호출 할 때, 당신은 단지 새로운 동일한 튜플을 만들 수 있습니다.

UPDATE : 당신이 (school, totalAmount) 결과에 관심이 있다면 , 당신은 키의 첫 번째 부분 취해야한다 (튜플 자체이다!) :

.map(each => (each._1._1, each._2)) 

또는 사용하여 더 좋은 버전 패턴 매칭 : 키도 payment 페이지를 포함하기 때문에이 결과는, 같은 school 값으로 여러 레코드를 포함 할 수 있음을

.map { case ((school, _), amount) => (school, amount) } 

주 미술. 입력 값에 다른 지불 값을 가진 학교가 두 번 나타난 경우 -이 마지막 결과는 고유 한 school 값을 갖지 않습니다.

+0

멋진 설명 (y) –