아래 대부분의 내용은 도서 빅데이터를 지탱하는 기술에서 발췌했습니다.

이번 포스트에서는 pivot, 행/열 지향 데이터베이스, MPP, 스타 스키마, 비정규화 테이블을 다룹니다.


Pivot

  • DB에 저장/관리가 쉬운 형태인 transaction tablecross table로 바꾸어주는 것
  • transaction table
Data Item Cost
08-06 A $100
08-07 B $50
08-08 B $50
  • cross table
  08-06 08-07
Item A B
Cost $100 $50
  • pandas의 pivot_table() 사용
>>> df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo",
...                          "bar", "bar", "bar", "bar"],
...                    "B": ["one", "one", "one", "two", "two",
...                          "one", "one", "two", "two"],
...                    "C": ["small", "large", "large", "small",
...                          "small", "large", "small", "small",
...                          "large"],
...                    "D": [1, 2, 2, 3, 3, 4, 5, 6, 7],
...                    "E": [2, 4, 5, 5, 6, 6, 8, 9, 9]})
>>> df
     A    B      C  D  E
0  foo  one  small  1  2
1  foo  one  large  2  4
2  foo  one  large  2  5
3  foo  two  small  3  5
4  foo  two  small  3  6
5  bar  one  large  4  6
6  bar  one  small  5  8
7  bar  two  small  6  9
8  bar  two  large  7  9

>>> table = pd.pivot_table(df, values='D', index=['A', 'B'],
...                     columns=['C'], aggfunc=np.sum)
>>> table
C        large  small
A   B
bar one    4.0    5.0
    two    7.0    6.0
foo one    4.0    1.0
    two    NaN    6.0


행 지향 데이터베이스

  • column-oriented
  • 일반적으로 업무 시스템에서 사용되는 데이터베이스는 레코드 단위의 읽고 쓰기에 최적화되어있음
  • 대량의 트랜잭션을 지연 없이 처리하기 위해 데이터 추가를 효율적으로 할 수 있도록 함
    • 새로운 레코드를 추가할 경우에는 끝부분에 추가되므로 고속으로 쓰기 가능
  • 데이터 검색을 고속화하기 위해 index 사용
  • RDB가 이에 해당


열 지향 데이터베이스

  • 데이터 분석에서는 어떤 column이 사용되는지 미리 알 수 없다. 일부 column만 집계 대상이 된다. 행 지향 데이터베이스에서는 필요없는 데이터까지 로드되어 디스크 I/O가 증가할 수 있음
  • index가 도움이 되지 않음
  • 데이터의 압축 효율도 우수
    • 같은 coulumn에는 유사한 데이터가 나열되기 때문
      • e.g.) 같은 문자열의 반복


MPP 데이터베이스
  • 행 지향 데이터베이스에서는 보통 하나의 쿼리는 하나의 스레드에서 실행된다.
    • 여러개의 코어를 쓰더라도 개별 쿼리가 분산 처리 되는 것은 아님
  • 반면, 열 지향 데이터베이스에서는 디스크에서 대량의 데이터를 읽기 때문에 쿼리 실행 시간이 길어지고, 압축된 데이터의 전개 등으로 CPU resource를 많이 필요로 한다.
    • 멀티 코어를 활용해 고속화하는 것이 좋음!
  • MPP에서는 하나의 쿼리를 다수의 작은 태스크로 분해하고 이를 가능한 병렬로 실행함
    • e.g.) 1억 레코드의 합을 구해야한다면, 10만 레코드 * 1,000개의 태스크로 나눈다. 독립적으로 각각의 합계를 집계해 마지막에 모든 결과를 모아 summation을 구함
    • MPP는 고속화를 위해 CPU, 디스크 모두를 균형있게 늘려야함
  • 열 지향 데이터베이스와 MPP 데이터베이스를 결합하면 데이터의 집계가 크게 고속화된다! 하지만, 그만큼 쿼리의 리소스 사용량도 많이 증가한다. 쿼리 실수로 인한 과부하 등 리소스 관리에 주의해야한다.
  • MPP Database: 하드웨어 수준에서 데이터 집계에 최적화된 데이터베이스


처리량과 지연시간

  • 데이터 처리의 성능은 1) 처리량, 2) 지연시간으로 표시된다.
  • 처리량: 일정 시간에 처리할 수 있는 데이터의 양
    • 데이터 웨어하우스/데이터 레이크에서는 대량의 데이터를 처리하기 위해 처리량을 중시해 설계
  • 지연 시간: 데이터 처리가 끝날 때까지의 대기 시간
    • 데이터 마트에서는 지연 시간의 단축이 요구됨
    • 충분한 메모리 준비, 디스크 I/O 절감


대시보드 도구와 BI 도구

  • 대시보드 도구: 새로운 그래프를 쉽게 추가하는데 중점
    • Redash: SQL에 의한 쿼리 실행 결과를 그대로 시각화
    • Superset: 대화형 대시보드 제작
  • BI 도구: 대화형 데이터 탐색, 보다 시간을 들여 데이터를 자세히 보고 싶은 경우
    • Tableau


트랜잭션과 마스터

  • Transaction: 시간과 함께 생성되는 데이터
    • 한 번 기록되면 변하지 않음
  • Master: 트랜잭션에서 참고되는 각종 정보
    • 각종 상황에 따라 다시 쓰임


데이터 웨어하우스의 스타 스키마

  • Fact table: Transaction과 같이 사실이 기록된 것, 주로 집계의 기반이 되는 숫자 데이터
  • Dimension table: 참고되는 마스터 데이터, 주로 데이터를 분류하기 위한 속성값
  • 데이터 마트를 만들 때는 팩트 테이블을 중심으로 여러 디멘젼 테이블을 결합하는 것이 좋음
    • 이러한 schema를 star schema라고 함
  • Fact table이 커지면 쿼리의 지연이 발생, 최대한 팩트 테이블을 작게하는 것이 고속화에 있어서 중요함
    • 따라서, fact table에는 ID같은 키만을 남겨두고, 나머지는 dimension table로 옮김
    • 앞서 언급했던 RDB의 장점!


데이터 마트의 비정규화 테이블

  • 열 지향 스토리지를 갖는 시스템이 보급됨에 따라 컬럼의 수가 아무리 늘어나도 성능에 영향를 주지 않는다.
  • 처음부터 팩트 테이블에 모든 컬럼을 포함해두고, 쿼리의 실행시에는 테이블 결합을 하지 않는 편이 간단함
  • 따라서 데이터 마트에는 스타 스키마가 아니라 비정규화 테이블을 사용하는 것이 바람직하다.
  • 비정규화 테이블: 스타 스키마에서 좀 더 비정규화를 진행해 모든 테이블을 결함한 하나의 거대한 팩트 테이블


Dimension과 Measure

  • Measure
    • 숫자 데이터와 그 집계 방법을 정의하는 것
    • e.g.) sum(“cost”)
  • Dimension
    • 크로스 집계에 있어서의 행과 열을 이용하는 것
    • dimension으로 사용하는 데이터는 평소 정기적인 스냅샷으로 이력을 축적해두어야 한다.
  • e.g.) 월별로 상품의 매출을 알고 싶다면?
    • 측정값: 금액
    • 디멘전: 판매일, 상품값


Cardinality

  • 각 column이 취하는 값의 범위
  • 취할 수 있는 값이 적은 것은 카디널리티가 작은 것
    • e.g.) 성별은 카디널리티가 작고, IP주소는 크다
  • 모든 칼럼의 카디널리티를 줄여야 테이블을 작게 집약할 수 있다.
    • IP 주소와 같이 여러 값이 있는 것은 위치 정보로 변환하는 등 카디널리티를 줄여야된다.