대용량 데이터 분석
개요
•
분석할 데이터 : 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
복사