📌 목차
- Matrix Computaton
🍀 Matrix Computaton
a 행렬의 행의 개수가 m개, 열의 개수가 k개이다. b 행렬의 행의 개수가 k개, 열의 개수가 n개이다. a*b = c일 때, c 행렬은 행의 개수가 m개, 열의 개수가 n개이다. a 행렬의 열의 개수 = b 행렬의 행의 개수 이어야 한다.
a 행렬은 행을 선택하고, b 행렬은 열을 선택해서 a 행렬은 왼 -> 오, b 행렬은 위 -> 아래로 차례대로 곱해서 더한다. a 행렬의 첫 번째 행, b 행렬의 두 번째 열을 선택하여 결과 행렬 c 행렬의 첫 번째 행의 두 번째 열에 배치된다. -> 행렬 a의 행의 인덱스가 i, 행렬 b의 열의 인덱스가 j 이면 결과는 C의 i,j에 들어간다.
연산 순서는 두 단계이다. 첫 번째 단계를 위해서 a 행렬의 값과 b 행렬의 값이 만나서 곱 계산이 되어야 한다. 행렬 a, b는 각각 다른 파일에 저장되어 있을 것이고 파일을 읽어서 RDD로 만들면 최소 2개 RDD가 만들어진다. 그 값에 대해서 합쳐서 곱해야 한다. reduceByKey가 언젠가 호출이 될 것이다. ai0과 b0j가 만나야 하고 key가 같아야 만나서 곱해진다.
두 번째 단계에서도 reduceByKey로 값들이 모두 만나서 더해져야 한다. 곱해진 값들이 같은 key를 갖도록 해야 모두 더해진다.
aix는 key를 (i,0,x), (i,1,x) ... , (i, n-1, x)로 하여 총 n번 처리되어야 한다. bxj는 key를 (0,j,x), (1,j,x) ... , (m-1, j, x)로 하여 총 m번 처리되어야 한다.
🔅 Matrix Multiplication 흐름
- matrix_a, matrix_b 파일 읽어오기
- 곱셈할 짝을 짓기 위해 matrix_a이 element에 key 붙이기
- 곱셈할 짝을 짓기 위해 matrix_b의 element에 key 붙이기
- 두 RDD 합치기 (union)
- 짝이 맞는 element끼리 곱하기 (reduceByKey)
- 덧셈을 위해 key 변경하기
- 같은 key를 갖는 element끼리 더하기 (reduceByKey)
- 결과를 텍스트 파일로 저장하기
3은 총 2번 곱해져야 한다. matirx_b의 열의 개수만큼 output으로 만들어줘야 한다. (0,0)은 (0,j,0)로 만들어주는 것이다. 이때 j는 0,1이다. 4는 위치가 (0,1)이고 이를 (0,j,1)로 만들어주는 것이다. 이때 j도 0,1이다. 각 행에 대해서 martix_b의 열의 개수만큼 처리한다. 하나에 대해 두 개가 되면, 8개의 아이템이 4개의 list로 갖게 되는 것인데 이 경계를 없애준다.
(0,0)은 (i,0,0)로 만들고 i에 들어갈 값은 0,1이다. (0,1)은 (i,1,0)로 만든다. 각 열에 대해서 matrix_a의 행의 개수만큼 만들어줘야 한다. 두 RDD에 대해서 key가 같은 값끼리 만나서 곱해져야 한다. 두 RDD가 합쳐져야 한다.
🔅 Pseudo code
matrix a,b를 텍스트 파일에서 읽어오고 파라미터로 행렬의 크기를 받아온다. a에 대해서 flatMapToPair 호출한다. 행렬 a는 b의 열의 개수만큼 처리하고 b는 a의 행의 개수만큼 처리한다. 그리고 두 RDD를 union하고, 그 결과를 곱에 해당하는 function을 만들어서 reduceByKey를 호출하면 곱한 결과가 나온다. mapToPair를 호출해서 key 개수를 3->2개로 축소해서 다시 Tuple로 만든다. 최종적으로 만들어진 RDD를 갖고 덧셈에 해당하는 function을 구현하고 다시 reduceByKey를 호출하면 우리가 원하는 결과가 나온다. 그 결과를 다시 파일에 쓰게 되면 이때 action이 수행된다.
'CS > Data Engineering' 카테고리의 다른 글
[Data Engineering] Data Mining (K-means clustering) (1) | 2023.06.09 |
---|---|
[Data Engineering] Spark - Relational Processing (1) | 2023.06.09 |
[Data Engineering] Relational Data Processing(Join) (0) | 2023.06.08 |
[Data Engineering] Spark (0) | 2023.06.08 |
[Data Engineering] Relational Data Processing (Projection/Selection), Top-k (0) | 2023.06.08 |