GCP/BigQuery

geojson 파일을 bigquery 적재 (geography 활용)

데이터엔지니어 주형권 2020. 10. 6. 15:35
반응형

여러 가지 형태의 데이터를 bigquery에 넣어서 볼 수 있습니다. 

이번 포스트에서는 그중에 하나인 geojson을 bigquery에 업로드하는 방법을 정리하였습니다.

이미 몇몇 블로그에서 geojson 적재하는 방법을 소개하고 있는데요.

안 되는 부분이 많아서 제가 직접 정리하였습니다. 

 

사용된 환경은 MAC입니다. 

또한 추가적으로 Python3가 필요합니다.

우선 geojson을 다운로드합니다. ( geojson 샘플 다운로드 )

아래와 같이 지정하고 Save 부분을 누르면 geojson으로 다운로드 가능합니다.

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, intelse "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로 직접 넣으려고 하시는 경우가 있는데 이 경우도 가능합니다. 

다만 스키마를 지정해 주지 않고 "자동감지"로 넣으실 경우 다음과 같이 잘못된 결과가 나옵니다.

자동 감지 옵션으로 넣을 경우

 

bq로 적재 (위) 자동감지 적재(아래)

위와 같이 결과 값이 완전히 다른 데이터임을 확인할 수 있습니다.

자동감지를 할 경우 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

 

반응형