이유
항해 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를 통해 확인했다.
'개발일지 > TIL' 카테고리의 다른 글
[230623] 네트워크와 Java Spring 기본 개념 이해하기 (1) (3) | 2023.06.23 |
---|---|
[ 230622 ] 제대로 이해하고 하자 (0) | 2023.06.22 |
[ 230620 ] HttpServletRequest의 InputStream 문제 (0) | 2023.06.20 |
[ 230619 ] Chained Exception ? (0) | 2023.06.19 |
[ 230618 ] 사이드 프로젝트 Graphiql 적용하기 (0) | 2023.06.18 |