2016-07-13 6 views
0

간단한 단어 카운트 유형을 수행하기 위해 스캘링을 사용하고 있습니다. 튜플을 확장하기 위해 부분 함수를 사용할 때 오류가 발생합니다. 정확한 오류 메시지는 다음과 같습니다.Scalding : 부분 함수로 줄일 수 없습니다.

Error:(15, 14) missing parameter type for expanded function 
The argument types of an anonymous function must be fully known. (SLS 8.5) 
Expected type was: (?, ?) => ? 
     .reduce{ case ((t1, v1), (t2, v2)) => 
      ^

튜플에 유형을 추가해도 도움이되지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

TypedPipe.from(PackedAvroSource[TrackPlay](args("input"))) 
    .map({ t => (t.getTrackId.toString, 1) }) 
    .groupBy(_._1) 
    .reduce{ case ((t1, v1), (t2, v2)) => 
     (t1, v1 + v2) 
    } 
    .values 
    .write(TypedTsv[(CharSequence, Int)](args("output"))) 

답변

0
당신은 컴파일러가 올바른 유형을 추론 할 수 없기 때문에 유형을 지정해야합니다

: 그래서 컴파일러는 Tuple2[Any, Any]을 유추하기 때문에 예상 된 결과를 계산할 수없는

유형이 지정된
.reduce[(String, Int)] { case ((t1, v1), (t2, v2)) => (t1, v1 + v2) } 

[U >: Tuple2[String, Int]]Tuple2[String, Int]을 입력하십시오. 섹션 8.5

이것에 더 : http://www.scala-lang.org/files/archive/nightly/pdfs/ScalaReference.pdf


보조 노트, 전체 로직에 대한 간단한 구현으로는 다음과 같습니다

TypedPipe.from(PackedAvroSource[TrackPlay](args("input"))) 
    .map(t => (t.getTrackId.toString, 1)) 
    .group 
    .sum 
    .toTypedPipe 
    .write(TypedTsv[(CharSequence, Int)](args("output"))) 
+0

내 방식이 작동하지 않는 이유 당신은 응답하지 않는 . 튜플을 확장하려면 case 문을 사용할 수 있어야합니다. 이 작업을 수행 할 수있는 방법은 여러 가지가 있으며 case 문과 함께 reduce가 작동하지 않는 이유를 알고 싶습니다. 감사! – Mayumi

+0

@Mayumi 나는 나의 대답을 업데이트했다 : –

+0

명확한 대답을 위해 대단히 감사합니다! – Mayumi