본 영상은 2021-2 KMOOC-데이터엔지니어링 강의의 원본이며, 강좌 오픈 이후에는 질의 응답 채널으로 이용 예정입니다. 각 Topic에 질문 해주시면 가능한 답은 달아드리도록 하겠습니다.
강의노트 (SlideShare) - https://www.slideshare.net/ssuser4a9113
코드 (GitHub) - https://github.com/JaewookByun/data_engineering
총 11강
구성
- ArrayList 연산
- MyArrayList - 배열 기반 List interface 구현
- LinkedList 연산
- MyLinkedList - 참조 기반 List & Queue interfaces 구현
- HashSet/HashMap 연산
- Lambda Expression
- Stream - Open JDK 15에서 이용가능한 거의 대부분의 연산을 다루려고 노력함
1. DataAnalysis
(Lecture 2 - Motivation)
1
Jaewook Byun
Ph.D. Assistant Professor, Department of Software, Sejong University
Associate Director, Auto-ID Labs, Korea
jwbyun@sejong.ac.kr , bjw0829@gmail.com
https://sites.google.com/view/jack-dfpl/home
2. 목차
• 간단한 실 세계 데이터 분석 수행
• 데이터 구조 사용의 필요성 이해
• 적절한 데이터 구조 사용의 필요성 이해 – 리스트
• 적절한 데이터 구조 사용의 필요성 이해 – 해시
• 적절한 데이터 구조 사용의 필요성 이해 – 트리
2
3. 실 세계 데이터셋 추출 및 모델링 실습
• 간단한 분석 수행
1. 줄 수 구하기
• line이라는 변수를 0으로 두고
• 파일의 줄을 읽을 때 마다 line을 하나씩 늘려 줌
• 예제의 답: 11
3
# Directed graph (each unordered…
# Email network of a large Europe…
# Nodes: 265214 Edges: 420045
# FromNodeId ToNodeId
0 1
0 2
0 4
1 3
2 5
3 1
3 4
0이 1에게 메일을 보낸 이벤트
d:email.txt 예제
4. 실 세계 데이터셋 추출 및 모델링 실습
• 간단한 분석 수행
1. 줄 수 구하기
• 유튜브: https://youtu.be/9I9TzDa__so
4
5. 실 세계 데이터셋 추출 및 모델링 실습
• 간단한 분석 수행
2. 이벤트의 수 구하기
• 줄 수를 구할 때 #로 시작되는 줄에서는 line을 늘려주지 않음
• 예제의 답: 7
5
# Directed graph (each unordered…
# Email network of a large Europe…
# Nodes: 265214 Edges: 420045
# FromNodeId ToNodeId
0 1
0 2
0 4
1 3
2 5
3 1
3 4
0이 1에게 메일을 보낸 이벤트
d:email.txt 예제
6. 실 세계 데이터셋 추출 및 모델링 실습
• 간단한 분석 수행
2. 이벤트의 수 구하기
• 유튜브: https://youtu.be/3Cr3YS_2DPw
6
7. 실 세계 데이터셋 추출 및 모델링 실습
• 간단한 분석 수행
3. 최소 사람 ID를 구하기
• min이라는 변수를 아주 큰 수로 두고
• 각 줄마다 확인되는 ID가 min보다 작으면 갱신
7
# Directed graph (each unordered…
# Email network of a large Europe…
# Nodes: 265214 Edges: 420045
# FromNodeId ToNodeId
0 1
0 2
0 4
1 3
2 5
3 1
3 4
0이 1에게 메일을 보낸 이벤트
d:email.txt 예제
8. 실 세계 데이터셋 추출 및 모델링 실습
• 간단한 분석 수행
3. 최소 사람 ID를 구하기
• 유튜브: https://youtu.be/ayniDgWBktQ
8
9. 실 세계 데이터셋 추출 및 모델링 실습
• 간단한 분석 수행
4. 최대 사람 ID를 구하기
• max라는 변수를 아주 작은 수로 두고
• 각 줄마다 확인되는 ID가 max보다 크면 갱신
9
# Directed graph (each unordered…
# Email network of a large Europe…
# Nodes: 265214 Edges: 420045
# FromNodeId ToNodeId
0 1
0 2
0 4
1 3
2 5
3 1
3 4
0이 1에게 메일을 보낸 이벤트
d:email.txt 예제
10. 실 세계 데이터셋 추출 및 모델링 실습
• 간단한 분석 수행
4. 최대 사람 ID를 구하기
• 유튜브: https://youtu.be/jLa_NYYxE78
10
11. 데이터 구조 사용의 필요성
• 간단한 분석 수행
• 파일을 4번 읽어 다음의 분석 수행
1. 줄 수 구하기
2. 이벤트의 수 구하기
3. 최소 사람 ID를 구하기
4. 최대 사람 ID를 구하기
11
email.txt
파일시스템
분석1
분석2
분석3
분석4
12. 데이터 구조 사용의 필요성
• 간단한 분석 수행
• 파일을 4번 읽어 다음의 분석 수행
• 유튜브: https://youtu.be/P9C8ZQp-YrA
12
13. 데이터 구조 사용의 필요성
• Data Structure(데이터 구조)의 필요성
• Data Structure: 효율적인 접근 조작을 가능하게 하는 데이터 조직/관리/저장 구조
• Array(배열)
• Homogeneous(동종)한 Value(값)의 모음
• int 모음, bool 모음, String 모음, Object 모음
• 연속된 메모리 공간에 고정된 개수의 Value들을 저장
• Index에 의해 Value를 GET 혹은 SET 할 수 있음
13
int[] GET
int[] array = new int[5];
array[0] 1 2 3 4 5
array[1]
array[2]
array[3]
array[4]
첫 인덱스
length 5의 Array
14. 데이터 구조 사용의 필요성
• Data Structure(데이터 구조)의 필요성
• Data Structure: 효율적인 접근 조작을 가능하게 하는 데이터 조직/관리/저장 구조
• Array(배열)
• Homogeneous(동종)한 Value(값)의 모음
• int 모음, bool 모음, String 모음, Object 모음
• 연속된 메모리 공간에 고정된 개수의 Value들을 저장
• Index에 의해 Value를 GET 혹은 SET 할 수 있음
14
int[] (Reference type)
int[] array = new int[5]; 0 0 0 0 0
15. 데이터 구조 사용의 필요성
• Data Structure(데이터 구조)의 필요성
• Data Structure: 효율적인 접근 조작을 가능하게 하는 데이터 조직/관리/저장 구조
• Array(배열)
• Homogeneous(동종)한 Value(값)의 모음
• int 모음, bool 모음, String 모음, Object 모음
• 연속된 메모리 공간에 고정된 개수의 Value들을 저장
• Index에 의해 Value를 GET 혹은 SET 할 수 있음
15
int[] SET
int[] array = new int[5];
array[0] = 1;
1 0 0 0 0
16. 데이터 구조 사용의 필요성
• Data Structure(데이터 구조)의 필요성
• Data Structure: 효율적인 접근 조작을 가능하게 하는 데이터 조직/관리/저장 구조
• Array(배열)
• Homogeneous(동종)한 Value(값)의 모음
• int 모음, bool 모음, String 모음, Object 모음
• 연속된 메모리 공간에 고정된 개수의 Value들을 저장
• Index에 의해 Value를 GET 혹은 SET 할 수 있음
16
int[] SET
int[] array = new int[5];
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
array[4] = 5;
1 2 3 4 5
17. 데이터 구조 사용의 필요성
• Data Structure(데이터 구조)의 필요성
• Data Structure: 효율적인 접근 조작을 가능하게 하는 데이터 조직/관리/저장 구조
• Array(배열)
• Homogeneous(동종)한 Value(값)의 모음
• int 모음, bool 모음, String 모음, Object 모음
• 연속된 메모리 공간에 고정된 개수의 Value들을 저장
• Index에 의해 Value를 GET 혹은 SET 할 수 있음
17
int[] GET
int[] array = new int[5];
array[0] 1 2 3 4 5
array[1]
array[2]
array[3]
array[4]
18. 데이터 구조 사용의 필요성
• Data Structure(데이터 구조)의 필요성
• Data Structure: 효율적인 접근 조작을 가능하게 하는 데이터 조직/관리/저장 구조
• Array(배열)
• Homogeneous(동종)한 Value(값)의 모음
• int 모음, bool 모음, String 모음, Object 모음
• 연속된 메모리 공간에 고정된 개수의 Value들을 저장
• Index에 의해 Value를 GET 혹은 SET 할 수 있음
18
int[] 순회 방법
for(int index = 0 ; index < array.length ; index++)
System.out.println("array["+index+"]value:"+array[index]);
for(int value : array)
System.out.println(value);
19. 데이터 구조 사용의 필요성
• Array를 이용한 데이터 재사용 실습
• Email[]에 데이터 셋을 적재하여 재사용
• 공간: 파일 시스템 > 메모리
• 속도: 메모리 > 파일 시스템
• 유튜브: https://youtu.be/mBAWGfTdCZw
19
20. 적절한 데이터 구조 사용의 필요성 - 리스트
• List(리스트) 자료구조의 필요성
• Array(배열)
• Homogeneous(동종)한 Value(값)의 모음
• 연속된 메모리 공간에 고정된 개수의 Value들을 저장
• Index에 의해 Value를 GET 혹은 SET 할 수 있음
• 적절한 배열 크기는?
20
new Email[100000];
이벤트
420045개
부족
new Email[999999];
공간낭비
21. 적절한 데이터 구조 사용의 필요성 - 리스트
• List(리스트) 자료구조의 필요성
• 편리성: 길이가 자유로운 가변 데이터 구조를 통해 원 자료를 순서대로 저장
• 효율성: 데이터 크기의 변화에 따른 적절한 크기를 효율적으로 관리함
21
Head
8 1 9
6
22. 적절한 데이터 구조 사용의 필요성 – 해시
• 간단한 데이터 분석
5. 265213이라는 ID가 있는지 확인하기
• 접근 방법
• Email[]을 순회하며, 265213이 발견되면 “발견"을 출력하고 종료
22
23. 적절한 데이터 구조 사용의 필요성 – 해시
• 간단한 데이터 분석
5. 265213이라는 ID가 있는지 확인하기
• 유튜브: https://youtu.be/Cfc_f7EsRts
23
24. 적절한 데이터 구조 사용의 필요성 – 해시
• 간단한 데이터 분석
6. 이메일을 보낸 사람의 수 구하기
• 풀이 방법
1. ID를 중복없이 유지할 충분한 크기의 Integer[] senders 생성
2. Email[]을 순회하며, 각 ID에 대해 ID가 senders에 존재하지 않는 다면 추가
3. Email[]의 순회가 종료되었을 때, senders는 중복되지 않는 ID를 담고 있음. senders에서
null을 제외한 값의 수가 답
24
Integer[] senders = new Integer[999999];
null null null null null null null null null null
Integer[] Email
0 0 0 1 1 1 3 3 5 10
~ null null
265212 265213
~
25. 적절한 데이터 구조 사용의 필요성 – 해시
• 간단한 데이터 분석
6. 이메일을 보낸 사람의 수 구하기
• 풀이 방법
1. ID를 중복없이 유지할 충분한 크기의 Integer[] senders 생성
2. Email[]을 순회하며, 각 ID에 대해 ID가 senders에 존재하지 않는 다면 추가
3. Email[]의 순회가 종료되었을 때, senders는 중복되지 않는 ID를 담고 있음. senders에서
null을 제외한 값의 수가 답
25
Integer[] senders
0 null null null null null null null null null
Integer[] Email
0 0 0 1 1 1 3 3 5 10
~ null null
265212 265213
~
0 1 null null null null null null null null ~ null null
0 1 3 null null null null null null null ~ null null
26. 적절한 데이터 구조 사용의 필요성 – 해시
• 간단한 데이터 분석
6. 이메일을 보낸 사람의 수 구하기
• 풀이 방법
1. ID를 중복없이 유지할 충분한 크기의 Integer[] senders 생성
2. Email[]을 순회하며, 각 ID에 대해 ID가 senders에 존재하지 않는 다면 추가
3. Email[]의 순회가 종료되었을 때, senders는 중복되지 않는 ID를 담고 있음. senders에서
null을 제외한 값의 수가 답
26
Integer[] senders
0 1 3 5 10 null null null null null ~ null null
….
0 1 3 5 10 11 12 14 15 16 ~ 265212 265213
Integer[] senders
27. 적절한 데이터 구조 사용의 필요성 – 해시
• 간단한 데이터 분석
6. 이메일을 보낸 사람의 수 구하기
• 유튜브: https://youtu.be/a8lrjUKVCak
27
28. 적절한 데이터 구조 사용의 필요성 - 해시
• Hash(해시) 자료구조의 필요성
• 간단한 분석 5,6
• 5번 문제: 빠른 탐색의 필요성
• 6번 문제: 중복 제거의 필요성
28
KEY
DATA
Hash 함수
KE
Y
DATA
29. 적절한 데이터 구조 사용의 필요성 - 트리
• 간단한 데이터 분석
7. 100000의 다음 ID 찾기
• 접근 방법
1. 해당 ID를 유지할 int higher를 아주 큰 수로 초기화 한다.
2. Email[]을 순회하며, 각 ID에 대해 100000보다 크면서 higher 보다 작은 수가 발견되면, 갱
신한다.
3. 순회가 종료된 후, higher 의 값이 100000의 다음 값이다.
29
30. 적절한 데이터 구조 사용의 필요성 - 트리
• 간단한 데이터 분석
7. 100000의 다음 ID 찾기
• 유튜브 - https://youtu.be/vYbXHJKnhEg
30
31. 적절한 데이터 구조 사용의 필요성 - 트리
• 간단한 데이터 분석
8. 100000의 이전 ID 찾기
• 접근 방법
1. 해당 ID를 유지할 int lower를 아주 작은 수로 초기화 한다.
2. Email[]을 순회하며, 각 ID에 대해 100000보다 작으면서 lower 보다 큰 수가 발견되면, 갱
신한다.
3. 순회가 종료된 후, lower 의 값이 100000의 이전 값이다.
31
32. 적절한 데이터 구조 사용의 필요성 - 트리
• 간단한 데이터 분석
8. 100000의 이전 ID 찾기
• 유튜브 - https://youtu.be/9JbrvpKENlw
32
33. 적절한 데이터 구조 사용의 필요성 - 트리
• Tree(트리) 자료구조의 필요성
• 간단한 분석 7,8
• Key 간의 전후 관계를 효율적으로 유지할 수 있는 데이터 구조의 필요성
33
8
3 10
1 6
4 7
14
13
Key DATA
최소값 최대값
8의 다음값
`