2017-01-06 6 views
0

튜플의 목록으로 튜플을 방출하는 방법 :.대신 나는이처럼 보이는 끓는 작업이

수입 com.twitter.scalding을 {인수, CSV, 작업, TextLine입니다}

class DataJob(args: Args) extends Job(args) { 

    val input = args("input") 
    val output = Csv(args("output"), separator = ",") 

    def parseLine(x: String):Seq[(String, String, String, String)] = { 
    List(("a", "b", "c", "d")) //Returns a list, not a tuple 
    } 

    TextLine(input).mapTo('line -> ('v1, 'v2, 'v3, 'v4)) { 
    x:String => { 
    parseLine(x) // this code fails with arity error 
    } 
    }.write(Csv(args("output"))) 
} 

이 실행되면, 나는 다음과 같은 오류가 발생합니다 : 내 parseLine 기능은 튜플의리스트를 반환하지만 코드가 하나의 튜플이 방출 될 것으로 예상하기 때문에

Caused by: java.lang.AssertionError: assertion failed: Arity of (class com.twitter.scalding.LowPriorityTupleSetters$$anon$2) is 1, which doesn't match: + ('v1', 'v2', 'v3', 'v4') 

이입니다. 이 코드를 어떻게 작동시킬 수 있습니까? 난 그냥 변경하는 데 필요한 같은

답변

0

좋아 보인다 :

TextLine(input).mapTo('line -> ('v1, 'v2, 'v3, 'v4))

에 :

TextLine(input).flatMap('line -> ('v1, 'v2, 'v3, 'v4))

아직 정확하게 명확하지 왜 그렇게 어떤 응답 주시면 감사하겠습니다!

+1

flatMap은 이름에서 알 수 있듯이 매개 변수를 병합합니다. 이전에는 List (List (tuples))를 처리 한 행 목록 (Textline (input))이 입력되었습니다. 병합을 사용하면 원하는 것을 List (튜플)로 가져올 수 있습니다. 또는 List (("a", "b", "c", "d") 대신 직접 반환하도록 parseLine을 변경했을 수 있습니다), 그리고 그것도 작동해야합니다 (그리고 당신이 어떤 포인터 할당을 피하기 때문에 아마도 더 효율적입니다). – C4stor