GCP/BigQuery

[BigQuery] Json 파일 Import 오류

데이터엔지니어 주형권 2022. 7. 12. 15:20
반응형

안녕하세요. 

 

Python으로 BigQuery에 Json 형태의 데이터를 Import 하려고 할 때 다음과 같은 오류가 발생하여 계속해서 삽질을 하다가 원인을 찾고 해결하여 이러한 삽질을 방지하기 위해서 글을 올립니다. 

 

 

1. 무엇을 하려고 하였나?

  1. RDB에 있는 데이터를 Json 형태로 Local에 다운로드 
  2. 다운로드 한 Json 파일을 GCS로 업로드 
  3. GCS에 있는 Json 파일을 BigQuery에 Import 

3번에서 에러가 발생하였습니다. 에러 내용은 python과 BigQuery web UI에서 테이블 생성 기능으로 2가지 상황에서 각각 다르게 발생하였습니다. 

 


2. Error 내용

1. python에서 발생하는 Error

google.api_core.exceptions.BadRequest: 400 Error while reading data, error message: JSON table encountered too many errors, giving up. Rows: 1; errors: 1. Please look into the errors[] collection for more details.

 

2. BigQuery Web UI에서 발생하는 Error

Error while reading data, error message: Failed to parse JSON: Unknown token type; Unexpected token; Parser terminated before end of string

3. Error를 확인 한 방법

위의 2가지 내용이 다른데 2번째 상황을 구글에서 검색하면 Json 형태가 안맞아서 그렇다고 나옵니다. BigQuery로 Import 할 때 줄 바꿈이 없거나 { }으로 감싸 져있지 않거나 \ 과 같은 문자나 ""가 두 개로 연속으로 있거나 하는 경우 위와 같은 상황이 발생할 수 있다고 합니다. 그래서 python을 이용하여 Json파일에 그런 것이 있는지 전부 1건씩 불러서 체크하였으나 전혀 없었습니다. 

 

그래서 다른 방법으로 Python으로 한건씩 불러서 Json으로 Load를 해보려고 하였습니다. 그런데, 다음과 같은 에러가 발생 하였습니다.

json.decoder.JSONDecodeError: Unexpected UTF-8 BOM (decode using utf-8-sig): line 1 column 1 (char 0)

 

구글에 검색하면 다음과 같은 내용이 나옵니다.

https://stackoverflow.com/questions/13156395/python-load-json-file-with-utf-8-bom-header

 

Python load json file with UTF-8 BOM header

I needed to parse files generated by other tool, which unconditionally outputs json file with UTF-8 BOM header (EFBBBF). I soon found that this was the problem, as Python 2.7 module can't seem to p...

stackoverflow.com

 

Json을 읽을 때 옵션으로 encoding=‘utf-8-sig’ 이 필요하다고 합니다. 그전에 개발할 때 이런 적이 없었는데, 이 옵션이 왜 필요한가 살펴보았는데, 제가 CSV로 저장을 하는 코드를 만들다가 글자가 깨지는 현상이 있어서 이 옵션을 넣었는데 Json도 같을 거라 생각해서 넣었는데, 이 옵션으로 Json 파일을 만들어서 BigQuery에서 정상적으로 인식하지 못한다고 결론 냈습니다. (추측)

 

결론적으로 encoding=‘utf-8-sig’ 옵션을 빼고 row를 저장하였더니 정상적으로 BigQuery에 Import를 하였습니다. BigQuery를 쓰면서 다시 한번 Error가 친절하지 않다는 생각을 했습니다...

반응형