Databricks에서는 다양한 테이블을 만들 수 있습니다. 외부(external) 테이블도 그중 한 가지입니다. 외부 테이블은 csv / json / parquet 등의 데이터를 그대로 Databricks에서 볼 수 있도록 만들어 줍니다. 그래서 Delta로 만드는 수고를 덜어줘서 굉장히 많이 쓰이는 기술입니다.
⚠️ 무엇이 문제였는가?
Databricks에서 외부 테이블을 만들때 하위의 모든 폴더를 포함해서 하나의 테이블로 만들고자 할 때는 잘 안됩니다. 특정 폴더 안에 모든 파일이 있으면 모르겠지만 YYYY/MM/DD와 같이 폴더가 년/월/일로 구분이 되어 있고 이 폴더를 모두 포함해서 하나의 테이블로 만들려고 하면 정상적으로 되지 않습니다.
CREATE TABLE sandbox.z_hkjoo.test_joo
(
date string
,user_key int
,user_name string
)USING PARQUET
LOCATION 's3://bucket_name/2024/'
2024년의 모든 월/일을 포함해서 테이블을 만들려고 하면 위와 같이 보통 만듭니다. 그럼 하위의 모든 폴더를 읽어서 테이블로 만든다고 생각이 들지만 그렇지 않습니다. 실제로 테이블은 만들어집니다. 하지만 아무런 값이 없습니다. 아마도 제 생각엔 2024년 폴더 아래에 있는 parquet 파일만 인식하고 폴더를 인식하지 못하는 것으로 보입니다.
그래서 다음과 같이 *을 넣어서 Query를 만들었는데 다음과 같은 오류가 나옵니다.
CREATE TABLE sandbox.z_hkjoo.test_joo
(
date string
,user_key int
,user_name string
)USING PARQUET
LOCATION 's3://bucket_name/2024/*'
오류 내용만 보면 S3에 권한이 없다고 보입니다. 하지만 저는 어드민인데요...? 권한 정상입니다.
실제로 이 내용을 검색하면 권한을 주라고 나오는 답변이 굉장히 많습니다. 그런데 이 문제가 전혀 아닙니다. 물론 권한 문제일 수 있으니 꼭 권한을 체크해 주시기 바랍니다.
✔️ 해결방법
해결방법은 의외로 간단 하였습니다. 옵션 한 줄을 추가하면 됩니다.
CREATE TABLE sandbox.z_hkjoo.test_joo
(
date string
,user_key int
,user_name string
)USING PARQUET
OPTIONS (recursiveFileLookup "true")
LOCATION 's3://bucket_name/2024/'
OPTIONS (recursiveFileLookup "true") 옵션을 넣으면 하위의 모든 폴더를 읽어서 하나의 테이블로 만들 수 있습니다. 이외에도 여러 가지 옵션이 있는 것으로 보이는데 찾아보니 공식문서에 내용이 없는 거 같습니다. (제가 못 찾았을 수도...?) 옵션을 정리한 곳이 있으면 제보 좀 부탁드립니다.