//////
Search
🍒

[1007] java 대용량 데이터 분석 프로젝트

생성일
2022/11/10 07:58
태그
java
TodayILearn
생성일 1

대용량 데이터 분석하기

Mdis 인구이동 데이터 분석하기

분석할 데이터
Mdis 인구 이동 통계 데이터 - 2021_인구관련연간자료_20220927_66125.csv (500M)
cvs란?
메타 데이터
데이터(data)에 대한 데이터
데이터에 관한 구조화된 데이터로, 다른 데이터를 설명해 주는 데이터

파일 읽기

FileReader 함수
한 문자 씩 읽기
 기본 문자 인코딩으로만 작동하는 파일에서 문자 스트림을 읽기 위한 편리한 클래스
read() 메소드를 사용
char를 한 글자씩 읽기 가능
int값 반환 char타입 형변환 필요
public static void main(String[] args) throws IOException { FileReader reader = new FileReader("파일 경로"); int ch; while ((ch = reader.read()) != -1) { System.out.print((char) ch); } }
Java
복사
파일의 글자를 한글자씩 읽어서 출력, stream의 끝에서 -1을 리턴하므로,  read()의 값이 -1이면, 더 이상 파일을 읽지 않고, 반복문을 종료
bufferedReader 함수
한 줄씩 읽기
FileReader보다 좀 더 효율적으로 파일을 읽어오기 가능
LeadLine() 메소드 사용
리턴값 String 고정으로 다른 타입은 형변환 필요
예외처리 필수 - 대개 throws IOException을 통하여 작업
public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader( new FileReader("파일 경로") ); String str; while ((str = reader.readLine()) != null) { System.out.println(str); } reader.close(); }
Java
복사
텍스트 파일을 한 줄씩 읽어서 리턴, 더 이상 읽을 내용이 없으면, null을 리턴

Parsing

parsing이란?
split() 함수
구분자를 기준으로 문자열을 잘라 배열로 리턴
사용 방법
public PopulationMove parse(String data) { // String data = "50,130,62000,2021,12,,,," String[] splittedLine = data.split(","); return new PopulationMove(splittedLine[6], splittedLine[0]); // 전to, 전출from }
Java
복사
- parse() 메소드 사용 : 전입, 전출 코드 구분 - split() 함수 사용 : 문자열을 쉼표(,)를 기준으로 나누어 배열(Array)에 저장해 리턴

파일 저장

File
Java.io 패키지는 기존의 파일이나 폴더에 대한 제어를 하는데 사용하는 File 클래스 제공
File클래스 : 파일 또는 폴더에 대한 정보를 제공
public void createAFile(String filename) { File file = new File(filename); try{ file.createNewFile(); }catch(IOException e){ throw new RuntimeException(e); } }
Java
복사

파일 쓰기

BufferedWriter
많은 양 출력 시 사용
flush() : 해당 버퍼 비우기
close() : 버퍼 닫기
개행 기능이 없음 - \n 사용
public void write(List<String> strs, String filename){ File file = new File(filename); try { BufferedWriter writer = new BufferedWriter(new FileWriter(file)); for(String str:strs){ writer.write(str); } writer.close(); } catch (IOException e) { e.printStackTrace(); } }
Java
복사

count 후 저장

Map
map이란?
키와 값을 한 쌍으로 저장하는 방식 (Key- Value 방식)
Key는 vlue를 찾기 위한 이름의 역할
특징
저장 순서 유지 X
Key : 중복 허용X , value : 중복 허용O
public Map<String, Integer> getMoveCntMap(List<PopulationMove> pml){ Map<String, Integer> moveCntMap = new HashMap<>(); for (PopulationMove pm : pml){ String key = pm.getFromSido() + "," + pm.getToSido(); if(moveCntMap.get(key) == null){ moveCntMap.put(key,1); } moveCntMap.put(key, moveCntMap.get(key)+1); } return moveCntMap; }
Java
복사
key: “전입,전출” , value : 이사 횟수 List<PopulationMove>을 통해 key 생성, key에 해당 값 없는 경우 value 생성

실습 코드

File 읽기

1. 전입시도 전출시도를 알고 이사한 개수를 알아보기
FromTo 서울 경기도
Java
복사
전입 시도 : 서울 / 전출 시도 : 경기도
서울에서 경기도로 이사온 가구의 횟수를 count할 것입니다.
가장 많이 이사간 지역은 어디인지 알아내는 것이 최종 목표
2. 데이터 파일에서 데이터를 읽어오기 (*.csv로 작성된 파일)
cvs란? Comma Separated Value. 콤마로 값을 분리한 데이터 파일을 의미합니다.
한 줄씩 읽어오기 위해 BufferedReader 사용
한 줄씩 값을 읽어오는 클래스
읽어올 파일의 주소(address)를 반드시 지정해야한다.
실습 코드
PopulationStatistics.java
3. populationmove 클래스를 생성
생성자 : 파일을 한 줄 한 줄 읽을 때마다 바뀌게 될 전입 시도/ 전출 시도를 초기화하는 역할
getter : private 필드에 접근하기 위한 메소드
실습 코드
populationMove.java

읽어온 문자열 분해

1. parsing을 하는 메소드를 만들기
이때 parsing 이란 ? 간단하게 말해서 구문 분석이라고 하며 자료에서 원하는 정보만 가공하고 추출해서 불러 오는 것이다. 해당 과정에서는 csv 파일을 , 를 기준으로 데이터를 분해하는 것을 목표로 한다.
메소드를 설계할 때 고려사항
1. 단일 책임의 원칙(Single Responsibility Principle) : 하나의 메소드엔 하나의 기능 구현 2. 메소드 이름 작성 시 기능을 파악할 수 있게 작성 3. return의 유무, return 데이터 타입 4. 파라미터로 무엇을 받을 것인가
Java
복사
단일 책임의 원칙
1. 메소드 확장 : 여러 기능이 하나의 메소드에 묶여있으면 이후 확장하기 까다롭다.
2. 중복코드 방지 : 메소드를 여러 번 재사용할 경우 사용되지 않을 코드의 반복을 막는다.
실습 코드
PopulationStatistics.java
PopulationMove.java
2.
Parse()를 적용한 PopulationMove 객체를 List에 저장
while문 안에서 600만 건의 문자열을 처리한다.
실습코드
PopulationStatistics.java

파일에 저장

1.
파일 생성 메소드
public void createAFile(String filename) { // 파일을 생성하는 메소드 File file = new File(filename); try{ file.createNewFile(); }catch(IOException e){ throw new RuntimeException(e); } }
Java
복사
PopulationStatics.java
2.
파일 쓰기 (BufferedWriter)
파일 작성 메소드
public void write(List<String> strs, String filename) { // 파일에 작성하는 메소드 File file = new File(filename); try{ BufferedWriter writer = new BufferedWriter(new FileWriter(filename)); for(String str : strs){ writer.write(str); } writer.close(); }catch (IOException e){ e.printStackTrace(); } }
Java
복사
실습 코드
PopulationStatistics.java
3. 저장한 파일 불러와서 파싱하기
parse() 로직 변경
위 실습결과 처럼 "11,28" 형태이므로, split하면 splittedL[0] = 11, splittedL[1] = 28
public PopulationMove parse(String str) { String[] splittedLine = str.split(","); return new PopulationMove(splittedLine[0], splittedLine[1]); // 변경 }
Java
복사
실습 코드
PopulationStatistics.java
4.
시도 코드는 총 몇 개 사용되었을까요?
Set을 이용해 사용된 시도코드를 1개씩만 뽑아 봅니다
public static void main(String[] args) throws IOException { String address = "./FromSidoToSido.txt"; PopulationStatistics statistics = new PopulationStatistics (address); List<PopulationMove> pml = statistics.readFileByLine(address); Set<Integer> sidoCodes = new HashSet<>(); for(PopulationMove pm : pml){ sidoCodes.add(pm.getFromSido()); sidoCodes.add(pm.getToSido()); } System.out.println(sidoCodes); } } /* [36, 41, 42, 11, 43, 44, 45, 46, 47, 48, 50, 26, 27, 28, 29, 30, 31] */
Java
복사

Map을 사용하여 어디로 많이 이사갔는지 개수 세기

1.
이사 횟수를 count하는 메소드 생성
map으로 key ="전입시도,전출시도"형태를 만들고 key가 해당될 때마다 value를++한다.
public Map<String, Integer> getMoveCntMap(List<PopulationMove> pml) { Map<String, Integer> moveCntMap = new HashMap<>(); for(PopulationMove pm : pml){ String key = pm.getFromSido() + ","+pm.getToSido(); if(moveCntMap.get(key) == null){ // moveCntMap에서 해당 key에 해당하는 Object가 없으면 생성 moveCntMap.put(key, 1); // 1로 초기화 } moveCntMap.put(key, moveCntMap.get(key)+1); //value++ } return moveCntMap; }
Java
복사
실습코드
PopulationStatistics.java
2.
HeatMap 형식 맞추기
메소드
public Map<String, Integer> heatmapIdxMap() { Map<String, Integer> heatMap = new HashMap<>(); heatMap.put("11",0); // 서울특별시 heatMap.put("26",1); heatMap.put("27",2); heatMap.put("28",3); heatMap.put("29",4); heatMap.put("30",5); heatMap.put("31",6); heatMap.put("36",7); heatMap.put("41",8); heatMap.put("42",9); heatMap.put("43",10); heatMap.put("44",11); heatMap.put("45",12); heatMap.put("46",13); heatMap.put("47",14); heatMap.put("48",15); heatMap.put("50",16); return heatMap; }
Java
복사
PopulationStatistics.java

도전 과제

1.
시도 매핑
2.
Context를 이용해 객체지향적 코드 작성
3.
bar chart / Heat Map 으로 시각화
21년 서울에서 가장 많이 이사간 지역은 ? (1. 서울 2. 경기도)