스파크에서 파일을 읽어 첫 번째 field의 값을 long으로 변환하는 코드가 있다고 하자.


val users = sc.textFile("users.txt").map{ line =>

 val fields = line.split(",")

 (fields(0).toLong, User(fields(1), fields(2)))

}


이전 예를 실행하고 난 후 


users.collect 호출 후 EOFException:Cannot seek after EOF 또는 java.lang.NumberFormatException: For input string: "" 에러가 발생하면 fields(0).toLong 대신 fields(0).toInt로 변경하면 에러가 발생하지 않을 수 있다. 


잘 보면. 

users.take(10) 할 때는 에러가 발생하지 않는데..

users.collect를 호출할 때 에러가 발생할 수 있다.




변환 문제 또는 원시 소스 이슈이다. 



이를 해결하기 위해서는 2가지 방법이 있다.


첫번째 원시 소스 이슈를 해결한다.  


두번째 첫 번째 방법은 사실, 대용량에서 자주 발생할 수 있어서 Try를 최대한 사용해 Option을 사용하는 것이 좋다. 


scala> def parseLong(s: String): Option[Int] = Try(s.toInt).toOption

parseLong: (s: String)Option[Int]


scala> parseLong("")

res24: Option[Int] = None





원시 파일이 문제가 없는지 살펴본다. 공백 라인이 있어도 안된다.






Posted by 김용환 '김용환'