앎을 경계하기

[가짜연구소3기] Data Engineer

[가짜연구소 3기] 데이터 엔지니어링 - 20 Load

양갱맨 2021. 8. 25. 18:29

주제

ETL의 Load에 대해서 배웠다.

분석용, 애플리케이션용 데이터베이스의 특징에 대해 배웠다.


분석을 위한, 또는 애플리케이션 데이터베이스

분석용 데이터베이스와 애플리케이션 데이터베이스는 명확히 구분된다.

분석 데이터베이스

  • 복잡한 집계쿼리가 자주 발생하기 때문에 이를 최적화해야한다.
  • 온라인 분석처리(OLAP)을 위해 데이터베이스를 최적화한다.
  • column-oriented라서 열 단위로 데이터를 저장한다.
  • 분석에서는 컬럼의 하위 집합에 대한 쿼리가 대부분이다.
    • 행 지향 시스템에서는 각 행에 대해서 사용하지 않는 컬럼을 스킵해야하는 과정이 필요하다.
  • 병렬화에 적합하다.

애플리케이션 데이터베이스

  • 초당 많은 트랜잭션이 발생하는 것을 최적화해야한다.
  • 온라인 트랜잭션(OLTP)를 위해 데이터베이스를 최적화한다.
  • Row-oriented라서 레코드 단위로 데이터를 저장한다.
  • 소규모 트랜잭션에서 행을 새로 추가하기 쉽다.

대규모 병렬 처리 데이터베이스(MPP databases)

쿼리가 단일 노드에서 요청되면, 하위 작업으로 분할되어 여러 노드에 분산되는 데이터베이스를 말한다.

MPP데이터베이스는 병렬 처리에 적합한 column-oriented 분석 데이터베이스이다.

대표적인 예

  • Amazon Redshift
  • Azure SQL Data Warehouse
  • Google BigQuery

Redshift 예제

AWS S3(파일스토리지서비스)에 파일을쓰고 Redshift에 복사 쿼리를 보낸다.

컬럼 저장 형식을 사용하는 파일에서 로드하는 것을 잘하기 때문에 parquet을 사용해서 데이터를 parquet으로 작성하는 함수들이 있다.

#Pandas의 to_parquet
df.to_parquet("./s3://path/to/bucket/customer.parquet")

#PySpark의 .write.parquet()
df.write.parquet("./s3://path/to/bucket/customer.parquet")

PostgreSQL 연결 URI를 사용해 Redshift에 연결하고 S3 데이터를 Redshift로 복사할 수 있다.

COPY customer
FROM 's3://path/to/bucket/customer.parquet'
FORMAT as parquet
...

PostgreSQL 데이터베이스로 로드하기

# 데이터 변환
recommendations = transform_find_recommendations(ratings_df)

#PostgreSQL 데이터베이스에 로드
recommendations.to_sql('recommendations',
												db_engine,
												schema='store',
												if_exists='replace')