티스토리 뷰

저와 비슷한 오류를 겪으실 분들을 위해 포스팅 합니다. ^^

얼마전 CSV 파일을 맵리듀스로 조인하는 예제를 작성하는데,
생뚱맞게 NumberFormatException 오류가 발생했습니다.

INFO mapred.FileInputFormat: Total input paths to process : 1
INFO mapred.FileInputFormat: Total input paths to process : 1
INFO mapred.JobClient: Running job: job_201203232321_0002
INFO mapred.JobClient:  map 0% reduce 0%
INFO mapred.JobClient:  map 20% reduce 0%
INFO mapred.JobClient:  map 80% reduce 0%
INFO mapred.JobClient:  map 80% reduce 26%
INFO mapred.JobClient: Task Id : attempt_201203232321_0002_m_000004_0, Status : FAILED
java.lang.NumberFormatException: For input string: "11"
  at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
  at java.lang.Integer.parseInt(Integer.java:449)
  at java.lang.Integer.<init>(Integer.java:660)
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  at org.apache.hadoop.mapred.lib.DelegatingMapper.map(DelegatingMapper.java:52)
  at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)
  at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:436)
  at org.apache.hadoop.mapred.MapTask.run(MapTask.java:372)
  at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
  at java.security.AccessController.doPrivileged(Native Method)
  at javax.security.auth.Subject.doAs(Subject.java:396)
  at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1083)
  at org.apache.hadoop.mapred.Child.main(Child.java:249)


보통 정수값이 아닌 공백이나 문자열을 쓰는 경우 NumberFormatException 오류가 나는데,
오류 로그에도 "11"이라고 정확히 출력되어 있었습니다.

매퍼의 입력 파일이 이상한게 의심스러워서, vi로도 확인했지만 11만 보였는데요.

결국 Integer.parseInt 메소드를 호출할 때 사용한 String을,
아래와 같이 바이트로 쪼개서 확인을 했습니다.

byte[] bytes = id.getBytes();
  for(int i = 0; i < bytes.length; i++) {
    byte[] tempBytes = new byte[1];
    tempBytes[0] = bytes[i];
    System.out.println(">>> bytesToString(1):" + tempBytes.toString());
    String bytesToString = new String(tempBytes);
    System.out.println(">>> bytesToString(2):" + bytesToString);
}


그런데......"11"의 바이트가 다섯개나 출력되더군요...--;;

attempt_201203232344_0012_m_000000_0: >>> i:0, byte:-17
attempt_201203232344_0012_m_000000_0: >>> bytesToString(1):[B@27982
attempt_201203232344_0012_m_000000_0: >>> bytesToString(2):?

attempt_201203232344_0012_m_000000_0: >>> i:1, byte:-69
attempt_201203232344_0012_m_000000_0: >>> bytesToString(1):[B@778255
attempt_201203232344_0012_m_000000_0: >>> bytesToString(2):?

attempt_201203232344_0012_m_000000_0: >>> i:2, byte:-65
attempt_201203232344_0012_m_000000_0: >>> bytesToString(1):[B@da90c
attempt_201203232344_0012_m_000000_0: >>> bytesToString(2):?

attempt_201203232344_0012_m_000000_0: >>> i:3, byte:49
attempt_201203232344_0012_m_000000_0: >>> bytesToString(1):[B@d58939
attempt_201203232344_0012_m_000000_0: >>> bytesToString(2):1

attempt_201203232344_0012_m_000000_0: >>> i:4, byte:49
attempt_201203232344_0012_m_000000_0: >>> bytesToString(1):[B@124111a
attempt_201203232344_0012_m_000000_0: >>> bytesToString(2):1

"11" 앞에 엉뚱하게 세 개의 바이트 코드가 들어가서 NumberFormatException 났던건데요.

CSV 파일은 엑셀에서 XLS 파일을 CSV로 저장한 것이였는데요.

수식으로 작성된 칼럼에 더미값이 들어갔었네요..ㅠㅠ

결국 메모장으로 CSV 파일을 만들어서 조인을 성공했습니다. ㅎㅎ


댓글
댓글쓰기 폼