geojson 파일을 bigquery 적재 (geography 활용)
여러 가지 형태의 데이터를 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
www.44bits.io/ko/post/cli_json_processor_jq_basic_syntax
medium.com/google-cloud/how-to-load-geojson-files-into-bigquery-gis-9dc009802fb4