//////
Search

221007

대용량 데이터 분석

개요

분석할 데이터 : Mdis 인구 이동 통계 2021 (500mb)
분석 목표 : 시·도 간 전입, 전출 횟수 도출
메타 데이터 : 데이터를 설명하기 위한 데이터
1번, 7번 데이터가 목표 데이터임.

실습 순서

1.
대용량의 CVS 데이터(콤마로 값을 구분)를 한 줄씩 읽어오기.
2.
필요한 값(전입, 전출)만 추출해 List로 만들기
3.
List 데이터를, txt파일에 저장.
4.
List를 Map의 키값으로 저장해, 전입·전출의 빈도수 확인
5.
최종 결과물인 Map을 txt파일로 저장.

1. 대용량의 CVS 데이터를 한 줄 씩 읽어오기.

// BufferedReader를 활용한 한 줄씩 읽는 메소드. // FileReader를 사용한 것보다 처리속도가 훨씬 빠름. public void justReadByLine(String filename) { String line = ""; try(BufferedReader reader = new BufferedReader(new FileReader(filename))) { while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } }
Java
복사

2. 필요한 값(전입, 전출)만 추출해 List로 만들기.

// 파일에서 한 줄을 읽어 온 뒤, 필요한 정보(전입과 전출)만 골라 리스트에 저장하는 메소드. public List<String> readAndPickData(String filename) { String line = ""; List<String> pml = new ArrayList<>(); try(BufferedReader reader = new BufferedReader(new FileReader(filename))) { // 한 줄 읽기 while ((line = reader.readLine()) != null) { // 한 줄의 데이터를 콤마를 기준으로 분리, 저장 String[] pickedData = line.split("\\,"); // 분리한 데이터 중, 전입·전출(1번, 7번 데이터)만 list에 add하기 pml.add(pickedData[6]+","+pickedData[0]+"\n"); } } catch (IOException e) { e.printStackTrace(); } return pml; // 메소드 실행 결과로는 전입, 전출 정보 담긴 list를 return
Java
복사

3. List 데이터를 txt파일에 저장.

// 3-1. 파일을 만드는 메소드 public void createFile(String filename) { File file = new File(filename); try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } }
Java
복사
// 3-2. txt 파일에 내용을 작성하는 메소드. // "List<String>"타입의 데이터를 받아, "filename"파일에 작성함 public void write(List<String> lists, String filename) { try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) { // List에서 정보를 한 줄씩 가져와 파일에 입력하기 for (String list : lists) { writer.write(list); } } catch (IOException e) { e.printStackTrace(); } }
Java
복사
// 3-3. 이제 txt파일에는 우리가 필요로하는 정보"만" 있음 // 그에 따른 메소드 수정 발생. public List<String> readAndPickData(String filename) { String line = ""; List<String> pml = new ArrayList<>(); try(BufferedReader reader = new BufferedReader(new FileReader(filename))) { while ((line = reader.readLine()) != null) { String[] pickedData = line.split("\\,"); // txt 파일로 가공하기 이전의 코드. // pml.add(pickedData[6]+","+pickedData[0]+"\n"); // txt 파일을 만든 후의 코드. pml.add(pickedData[1]+","+pickedData[0]); } } catch (IOException e) { e.printStackTrace(); } return pml; }
Java
복사

4. List를 Map의 키값으로 저장해, 전입·전출의 빈도수 확인

public Map<String, Integer> pMoveCnt(List<String> pmls) { Map<String, Integer> pmc = new HashMap<>(); for(String pml : pmls) { // 대입한 key값에 대응하는 value가 없으면 1로 초기화 if ( pmc.get(pml) == null) { pmc.put(pml, 1); } else { // value가 있다면, 그 value값에 1을 더하기. pmc.put(pml, pmc.get(pml)+1); } } return pmc; }
Java
복사

5. 최종 결과물인 Map을 txt파일로 저장.

public static void main(String[] args) { // 3단계에서 만든 txt파일을 이용. String address = "from_to2.txt"; // 메소드 사용을 위한 객체 생성. PopulationStatics ps = new PopulationStatics(); // txt 파일로 전입·전출 List 만들기 List<String> pml = ps.readAndPickData(address); // 위의 List를 Map으로 만들어 전입·전출 빈도수 체크 Map<String, Integer> pmc = ps.pMoveCnt(pml); // 3단계에서 만든 write 메소드를 사용하기 위해 // Map의 결과물을 다시 List로 변환. List<String> cntResult = new ArrayList<>(); for(String key : pmc.keySet()) { String[] splitedKey = key.split("\\,"); String str = String.format("key : %s,%s value : %d\n", splitedKey[0],splitedKey[1],pmc.get(key)); cntResult.add(str); } // List로 변환 된 Map의 정보를 txt파일에 저장. ps.write(cntResult,"each_sido_cnt2.txt"); }
Java
복사

결과.

key : 44,27 value : 2145 key : 44,26 value : 2627 key : 44,29 value : 1624 key : 44,28 value : 6699 key : 50,31 value : 492 key : 50,30 value : 670 key : 26,36 value : 455 key : 50,36 value : 200 key : 26,30 value : 1521 key : 43,50 value : 718 key : 26,31 value : 8416 key : 43,47 value : 3786 key : 43,48 value : 2191 key : 50,42 value : 636 key : 50,41 value : 7370 key : 26,45 value : 1136 key : 50,44 value : 858 ......(후략)
Java
복사