본문 바로가기

Programming/Tip&Informaion

[Spark/Scala] NullPointerException 발생 - Some(null) 문제

spark로 json 형식 데이터에서 특정 key의 value를 추출한 뒤, 해당 값 중 정규표현식으로 추출하는 로직이 있었다. (자체 제작 함수들)

extractJson(data, "key") match {
  case Some(a) => extraceRegex(a) match {
    case Some(b) => b
    case None => None
  }
  case None => None
}

 

대충 이런 형태인데, 여기서 평소에 발생하지 않던 NullPointerException이 발생했다. Option 형태로 처리를 하고 있는데, null이 발생한다는 게 이해가 되지 않았다.

 

원본 데이터를 까보니 {"key": null} 평소에 없던 이런 형태의 데이터가 들어오고 있었다.
그런데 그렇다 하더라도 null은 None으로 처리가 될 거라 해당 에러가 발생한다는 게 이해가 되질 않았는데..
null이 나와서 Some으로 감싸면 None이 아닌 Some(null) 형태로 만들어진다고 한다.

 

결국, Some(null) 에서 null을 가져와서 거기에 정규표현식을 사용하려 해서 NullPointerException이 발생한 거다.

 

scala에서 Null도 AnyRef의 확장이라 유효한 값으로 처리가 된다고 한다...
match case에서 Some(null) 로 예외처리를 하는 방식도 있으나 그냥 반환 값에 Option을 한 번 씌워주면 돼서 .flatMap(Option(_)) 을 붙이는 걸로 해결했다.