본문 바로가기

개발일지/TIL

[ 230621 ] 공공데이터 포털 200만건 데이터 DB에 넣기

이유

항해 99를 같이 듣는 팀원 분과 사이드 프로젝트를 하기로 했다. 많은 데이터를 처리하는 것을 목표로 잡았다. 그래서 많은 데이터가 필요했고 쉽게 구할 수 있는 공공데이터 포털을 사용하기로 했다. 약 200만 건(약 900M)인 일반 음식점 데이터를 가져다가 사용하기로 했다.

환경

데이터를 저장하기로 한 곳은 AWS의 RDS를 사용하기로 했다. 프리티어 버전으로 MySQL DB 인스턴스를 생성했다. 그리고 사용할 유저와 데이터베이스를 만들고 권한을 부여했다.

첫 번째 문제 사항

각 필드가 가진 최대 길이를 알지 못한다는 것이었다. 테이블을 생성할 때 임의의 길이로 만든다면 일차원 적으로 데이터베이스의 공간 낭비가 일어날 것이다. 또한 데이터를 넣을 때도 데이터의 길이가 맞지 않아 문제가 될 수 있었다.

해결 방안

간단하게 파이썬으로 각 테이블의 최대 길이를 구하는 코드를 작성했다.

 

with open("good_food.csv" , "r") as r :
    contents = r.read().replace('"','')

content_lines = contents.split("\n")
max_count_dic = dict()

for line in content_lines :
    elements = line.split(",")
    for index, element in enumerate(elements) :
        if element not in max_count_dic.keys() :
            max_count_dic[index] = len(element)

        if max_count_dic[index] < len(element) :
            max_count_dic[index] = len(element)

for key, value in max_count_dic.items() :
    print(str(key) + " : " + str(value))

두 번째 문제 사항

200만 건의 데이터를 각각 Insert 시키기에는 오랜 시간이 걸리다는 것이었다. 그리고 중간에 Insert가 실패라도 한다면 문제가 된 부분부터 다시 해야만 했다.

해결 방안

파일을 통째로 데이터베이스에 넣을 수 있는 LOAD 방식을 사용하기로 했다. Insert보다 훨씬 빠르다고 나와 있고 데이터의 형식만 일정하다면 각각의 Insert문 없이 데이터를 넣을 수 있어서 선택했다.

 

LOAD DATA LOCAL 
  INFILE '파일 위치' 
  INTO TABLE 테이블 이름 
  FIELDS TERMINATED BY ',' 
  ENCLOSED BY '"' 
  LINES TERMINATED BY ',\n';

결론

이 과정을 통해 데이터베이스에 정상적으로 모든 데이터가 들어간 것을 확인할 수 있었다. 눈으로 간단하게 100건 정도 확인했다. 그리고 들어간 데이터의 개수를 알 수 있는 Query를 통해 확인했다.