티스토리 뷰

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

얼마전 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 파일을 만들어서 조인을 성공했습니다. ㅎㅎ


저작자 표시 비영리 변경 금지
신고
댓글
댓글쓰기 폼