/////
Search
작성자
김희정
날짜
2022/10/07
학습 내용
대용량 데이터
텍스트

Java로 대용량 데이터 분석하기 프로젝트-김희정

■ 학습 목표

대용량 데이터 500MB를 읽을 수 있다. 읽어온 데이터를 메모리에 올릴 수 있다. 읽어온 데이터로 데이터 분석을 할 수 있다. [프로젝트]Mdis에서 받은 인구 이동 데이터로 2021 서울에서 가장 많이 이사 간 지역은 어디인지 알아내기

■Method 설계

하나의 메소드에서는 하나의 기능!
단일책임 원칙 적용
ex) filename받아서 파일을 읽는 기능,읽은 파일을 ,로 split하는 기능
기능을 한눈에 알 수 있도록 네이밍하기
lowerCamelCase로 작성
메서드 이름은 동사/전치사로 시작 (get, set, init, is, has, can, create, find, to, A-By-B)
메소드 네이밍 시 고려사항
왜 존재해야 하는가
무슨 작업을 하는가
어떻게 사용하는가
public List<Piece> findPiecesByColor(Color color){} // 왜 존재해야 하는가 - color에 대해 존재하는 piece들을 알기 위해. // 무슨 작업을 하는가 - color에 맞는 piece들을 가져온다. // 어떻게 사용하는가 - 체스판에서 흑색(or 백색)의 piece들을 가져와서 점수를 계산. 이름만으로도 언제 이 메서드를 호출해야 하는지 의미를 파악할 수 있도록
Java
복사

실습

0. 분석할 데이터 파악

분석할 데이터를 파헤쳐보기!
분석할 데이터 : 2021_인구관련연간자료_20221006_71548.csv
메타데이터 : 데이터(data)에 대한 데이터, 해당되는 데이터에 대한 설명
2021_인구관련연간자료의 메타데이터
csv
Comma Separated Values
쉼표로 구분된 값 파일(.csv)
ex ) 11,110,51500,2021,01,04,11,110,51500,5,1,033,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,9

1. 클래스 설계

PopulationStatistic 클래스
인구분석의 메인로직을 담당하는 클래스
파일 읽기, parsing, 전입-전출 횟수 count 등의 로직 관련 메소드main 실행 메소드
PopulationMove 클래스
전입, 전출 관련 클래스
constructor를 이용해 전입(toSido), 전출(fromSido)를 인스턴스 생성 시 정의 가능
코드

2. 파일 읽기

java로 작업하기 위해 파일(데이터)을 읽어 메모리에 올리기!
java에서 파일읽는 3가지 방법 존재
1) FileReader 이용
public void readByChar(String filename)
2) BufferedReader 이용
public void readByLine(String filename)
3) Files.newBufferedReader 이용
public void readByLine2(String filename)

3. Parsing

csv파일에서 내가 필요한 전입, 전출 정보만 추출하기!
Parsing이란? : 데이터에서 내가 원하는 정보만 가공하여 추출하는 것
public PopulationMove parse(String data)
전입, 전출 코드를 parsing하는 메소드
split() 이용 : ()안 구분자로 문자열을 잘라 String[] 배열에 넣어 리턴
11,110,51500,2021,01,04,11,110,51500,5,1,033,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,9 처럼 콤마(,)로 데이터가 분리되어있으니 split(”,”)를 써 “,”를 기준으로 자르고, 메타데이터에 따라 0번째인 전입과 6번째인 전출 코드를 추출해 Population 객체로 리턴
public PopulationMove parse(String data)코드

4. readByLine 메소드에 parse() 로직 추가

파일을 한줄씩 읽으면서 parsing하는 기능으로 update
readByLine 메소드 리팩토링
파일을 읽기만 하는게 아니라, 한줄씩 읽으면서 파싱하여 파싱한 결과를 list로 return
while문 안에서 string을 PopulationMove로 parsing하여 pml에 add
루프가 끝나면(파일을 모두 읽어서 파싱을 끝냈으면) return
public List<PopulationMove> readByLine(String filename) 코드

5. from_to.txt 생성하기

필요한 전입-전출 데이터만 저장할 새로운 파일 생성하기!
새 파일 생성하는 이유
public void createAFile(String filename)
파일이름이 filename인 파일을 생성하는 메소드
코드

6. 전입-전출 정보만 from_to.txt파일에 쓰기

필요한 전입-전출만 파일에 쓰기!
public void write(List<String> strs, String filename)
strs 리스트 내용을 filename 파일에 저장하는 메소드
코드
public String fromToString(PopulationMove populationMove)
파일에 전입.전출 코드 저장할 때 콤마(,)로 구분해 가공해주는 메소드
코드
Main
fromToString 으로 가공된 데이터를 write 함수를 통해 from_to.txt 에 저장
code

7. parse 로직 변경

분석할 파일이 .csv에서 from_to.txt 파일로 바꼈으니 parse로직도 변경!
parse() 메소드 수정
from_to.txt 구조 : 전입코드, 전출코드
code

8. 전입-전출 count 후 file에 저장

“전입-전출”을 case별로 count하기!
public Map<String, Integer> getMoveCntMap(List<PopulationMove> pml) 메소드
HashMap을 생성해 <key : ”전입,전출”, value : cnt> 형식으로 moveCntMap에 저장해 return하는 메소드
1.
List<PopulationMove>를 순환하면서 “11,26” 이런 형태의 key를 만든다.
2.
moveCntMap에서 해당 key에 해당하는 Object가 없으면 생성하고 1이라고 check한다.
3.
key로 value인 cnt를 꺼내서 +1
4.
moveCntMap 리턴
code
getMoveCntMap() 메소드에서 리턴된 moveCntMap을 each_sido_cnt.txt에 저장
Main 메소드 code

9. heatMap 그리기

히트맵을 그리기 위해 [x index, y index, count] 형식으로 for_heatmap.txt 파일에 저장하기!
public Map<String,Integer> getHeatmapIdx() 메소드
시도코드를 heatmap index로 맵핑하는 메소드
ex) 0 >> 11, 1 >> 26
code
Main 메소드
for_heatmap.txt에 heatmap 형식 : [전입시도 idx, 전출시도 idx, count]로 매핑해서 저장
map.keySet() : 해당 map의 key들을 모아서 Set 형태로 반환하는 메소드
code