Spark에서 save와 saveAsTable은 어떤 차이가 있을까?

Hyemi Noh
2 min readApr 16, 2023

--

spark를 처음 사용할 때 savesaveAsTable의 차이가 뭔지 헷갈렸다. 입문자가 보기에는 둘 다 저장하는 것이기 때문이다. 물론 메서드명에 나오듯이 하나는 그냥 저장하는 것이고 다른 하나는 테이블로 저장하는 것이다. 그런데 둘 다 저장 후 테이블 형태의 DF로 읽을 수 있어 차이를 알기가 어려웠다. 최근에 관련 부분을 살펴보면서 이제는 이해가 된 것 같아 글을 작성했다.

metastore

둘의 차이를 이해하기 위해서는 먼저 메타스토어를 이해해야한다. spark는 RDB처럼 자신이 직접 메타데이터를 관리하지 않는다. 메타스토어의 도움을 받는다. 메타스토어는 테이블, 컬럼, 파티션 등 데이터에 대한 메타데이터를 저장하는 저장소이다. spark를 사용하면 hive 메타스토어를 많이 사용한다. 따라서 spark에서 테이블이라는 용어가 등장하면 메타스토어와 엮인다.

save

save는 파일시스템에 영구적으로 데이터를 쓴다. 단, 메타스토어에 테이블로 쓰지 않는다. 즉, 메타스토어에 메타데이터를 갱신하지 않는다. 따라서 메타스토어가 변경사항을 파악하게 하려면 추가적인 커맨드가 필요하다. 예를 들어, DF에 컬럼을 추가해 save를 했다면 ALTER TABLE 명령어로 컬럼을 추가해야한다.

saveAsTable

saveAsTable도 파일시스템에 영구적으로 데이터를 쓴다. 테이블로 쓰기 때문에 메타스토어에 메타데이터가 갱신된다. 따라서별도의 커맨드가 필요하지 않다. 예를 들어, DF에 컬럼이 추가됐다면 추가된 컬럼이 테이블에 알아서 추가된다. 단, SaveMode에 따라서 에러 발생이 가능하니 주의해야한다. 이 예시는 overwrite를 기준으로 설명했다.

정리

  • save는 메타스토어에 메타데이터를 갱신하지 않는다.
  • saveAsTable은 테이블로 저장되기 때문에 메타스토어에 메타데이터가 갱신된다.

참고

--

--