[spark] EOFException:Cannot seek after EOF/java.lang.NumberFormatException: For input string: "" 해결하기
scala 2018. 5. 12. 21:49스파크에서 파일을 읽어 첫 번째 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
원시 파일이 문제가 없는지 살펴본다. 공백 라인이 있어도 안된다.
'scala' 카테고리의 다른 글
[spark] 머신 러닝 - CountVectorizerModel/CountVectorizerModel 예시 (0) | 2018.05.28 |
---|---|
[spark] spark-shell - Failed to start database 'metastore_db' with class loader 처리하기 (0) | 2018.05.28 |
[spark] 로컬 모드 아키텍처 [펌] (0) | 2018.03.29 |
[spark] 스파크 잡 튜닝 및 아키텍처 URL 펌질 (0) | 2018.03.29 |
[spark] 스파크 애플리케이션 튜닝 방법 - 펌 (0) | 2018.03.26 |