여러 가지 형태의 데이터를 bigquery에 넣어서 볼 수 있습니다.
이번 포스트에서는 그중에 하나인 geojson을 bigquery에 업로드하는 방법을 정리하였습니다.
이미 몇몇 블로그에서 geojson 적재하는 방법을 소개하고 있는데요.
안 되는 부분이 많아서 제가 직접 정리하였습니다.
사용된 환경은 MAC입니다.
또한 추가적으로 Python3가 필요합니다.
우선 geojson을 다운로드합니다. ( geojson 샘플 다운로드 )
아래와 같이 지정하고 Save 부분을 누르면 geojson으로 다운로드 가능합니다.

다운로드한 파일을 bigquery에 넣을 수 있도록 줄 바꿈 형태의 JSON 파일로 만들어야 합니다.
저 같은 경우 jq를 사용하였습니다.
| 
 1 
 | 
 brew install jq 
 | 
cs | 
간단하게 다운로드하고 다음의 구문을 입력하여 json으로 변환합니다.
| 
 1 
 | 
 jq --compact-output '.features[] | (.geometry | tojson) as $g | . = .properties | .geometry |= $g' < 원본.geojson > 결과.json 
 | 
cs | 
변환된 파일을 보관하고 다음으로 bigquery에 넣기 위해서 스키마를 추출하는 python 코드를 이용해서 스키마를 추출합니다.(출처)
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
 | 
 import json 
with open("파일위치", "r") as ifp: 
    with open("to_load.json", "w") as ofp: 
        features = json.load(ifp)["features"] 
        # new-line-separated JSON 
        schema = None 
        for obj in features: 
            props = obj["properties"]  # a dictionary 
            props["geometry"] = json.dumps(obj["geometry"])  # make the geometry a string 
            json.dump(props, fp=ofp) 
            print("", file=ofp)  # newline 
            if schema is None: 
                schema = [] 
                for key, value in props.items(): 
                    if key == "geometry": 
                        schema.append("geometry:GEOGRAPHY") 
                    elif isinstance(value, str): 
                        schema.append(key) 
                    else: 
                        schema.append( 
                            "{}:{}".format(key, "int64" if isinstance(value, int) else "float64") 
                        ) 
                schema = ",".join(schema) 
        print("Schema: ", schema) 
 | 
cs | 
위의 코드를 실행하면 아래와 같이 결괏값이 나옵니다.
Schema: geometry:GEOGRAPHY
여기서 geometry:GEOGRAPHY 가 스키마입니다. 이를 다음의 구문에 붙여 넣고 실행하면 bigquery에 로드됩니다.
| 
 1 
 | 
 bq load --source_format NEWLINE_DELIMITED_JSON 데이터셋.테이블명 변환파일.json geometry:GEOGRAPHY 
 | 
cs | 
아래와 같이 결과 메시지가 나옵니다.

위의 내용을 보면 json으로 변환된 파일을 UI에서 console로 직접 넣으려고 하시는 경우가 있는데 이 경우도 가능합니다.
다만 스키마를 지정해 주지 않고 "자동감지"로 넣으실 경우 다음과 같이 잘못된 결과가 나옵니다.


위와 같이 결과 값이 완전히 다른 데이터임을 확인할 수 있습니다.
자동감지를 할 경우 STRING으로 감지하여 데이터를 사용할 수 없으니 주의해야 합니다.
참고
stackoverflow.com/questions/24239056/load-geojson-in-bigquery
Load geojson in bigquery
What is the best way to load the following geojson file in Google Big Query? http://storage.googleapis.com/velibs/stations/test.json I have a lot of json files like this (much bigger) on Google S...
stackoverflow.com
www.44bits.io/ko/post/cli_json_processor_jq_basic_syntax
커맨드라인 JSON 프로세서 jq : 기초 문법과 작동원리
jq는 커맨드 라인 JSON 프로세서입니다. JSON 데이터를 입력받아 데이터를 필터링하거나 변형합니다. jq의 기본적인 문법과 작동 원리를 소개합니다.
www.44bits.io
medium.com/google-cloud/how-to-load-geojson-files-into-bigquery-gis-9dc009802fb4
How to load GeoJSON files into BigQuery GIS
An ETL pipeline for GeoJSON to BigQuery
medium.com
'GCP > BigQuery' 카테고리의 다른 글
| BigQuery - JSON 컬럼 파싱하기 (0) | 2021.08.10 | 
|---|---|
| BigQuery 성능/비용 팁 (2) | 2021.06.11 | 
| Python에서 BigQuery Query 실행 시 오류 (0) | 2021.06.04 | 
| big query 비용을 줄이기 위한 전략 (2) | 2020.03.04 | 
| big query(빅쿼리)에서 멱등성을 위한 전략 (0) | 2020.02.26 |