대표적인 파일 적재 형태

데이터를 적재하는 파일 형식은 대표적으로 2가지 방법이 있다.
Data in Row Format (행 기반), columnar file format (열 기반) 2가지 방법이 있다( 식견이 좁아 이 2개만 아는 것 일 수 있다.)

name email phoneNum
tom tom@gmail.com 010-0000-0001
justin justin@gmail.com 010-0000-0002
kim kim@gmail.com 010-0000-0003
  • 위와 같은 테이블이 존재한다 가정하고 아래 설명을 하겠습니다.

Data in Row Format (행 기반)

많은 사람들이 사용하는 Mysql 등 Row orented databased 에서 사용하는 파일 형태이다.

  • 간단하게 사진으로 보여주면 아래와 같은 형식으로 계속 옆으로 붙는다고 생각하면 된다.
    Pasted image 20231206140619.png
# CSV
name,email,phonNum
tom    , tom@gmail.com    , 010-0000-0001
justin , justin@gmail.com , 010-0000-0002
kim    , kim@gmail.com    , 010-0000-0003

# TSV
# 실제로는 tab으로 구분하지만, 보기 편하기 위해 줄을 맞 
name     email              phonNum
tom      tom@gmail.com      010-0000-0001
justin   justin@gmail.com   010-0000-0002
kim      kim@gmail.com      010-0000-0003

# JSON
{
	{name : tom    , email : tom@gmail.com    , phoneNum : 010-0000-0001} ,
	{name : justin , email : justin@gmail.com , phoneNum : 010-0000-0002} ,
	{name : kim    , email : kim@gmail.com    , phoneNum : 010-0000-0003}
}

위와 같이 본다면 CSV는 \n이 header가 되고, Json은 ,가 header가 된다고 봐도 될 것 같다.

  • 장점
    • 삽입 삭제에 용이하다
      • 그럼으로 쓰기 집약적인 작업에 적합하
      • 위에 코드와 같이 단순히 뒤에 붙여 넣으면 되기 때문 !
    • 모든 파일에 접근할 때 columnar보다 사용하기 좋다.
  • 단점
    • 데이터 집합 조회 시 성능 저하
      • 조회할 때 매번 모든 row를 읽어서 처리하기 때문

columnar file format (열 기반)

Spark ,Hive, 등에서 사용되는 파일 형식이다.
즉, 보통 대용량 데이터 처리할 때 많이 사용한다. (이때만 사용하는 것은 아니지만…?)
대표적으로 Parquet, ORC…등이 존재한다.
csv처럼 파일을 열어서 읽어서 보려고 했는데, 제대로 오지 않고, 검색하면 어떤 방식으로 적재가 되는 도식화된 사진만 있어
임의의 모양으로 예시를 들겠다.

name    |type-String|len-10 : tom          , justin          , kim
email   |type-String|len-10 : tom@gmail.com, justin@gmail.com, kim@gmail.com
phonNum |type-String|len-10 : 010-0000-0001, 010-0000-0002   , 010-0000-0003

대충 예시를 들면 위와 같다.
즉 열 기반이기 때문에 매번 Header를 추가하지 않고, 구분자만 추가하여 header에 사용되는 메모리를 절약할 수 있다.

  • 장점
    • 특정 칼럼만 읽어 처리하여 읽기 성능이 좋다
      • 예를 들어 select name,email from userTB where name = 'tom' 와 같은 조건의 쿼리문이 있다 예를 들면
      • where name = 'tom' 조건에 의해 name을 갖고 있는 칼럼만 읽어서 해당 인덱스를 가져온다
      • select name,email 이기 때문에 해당 name,email칼럼만 읽어서 조회하면 된다
      • 그로 인해 phonNum이라는 칼럼은 읽어드릴 필요가 없어진다. 그럼으로 보다 우수한 조회 성능을 갖을 수 있다
    • 압축 시 보다 좋은 성능을 보여준다
      • 100%는 아니지만, 같은 칼럼은 비슷한 값이 들어있기 때문에 보통은 최적화가 가능하다
      • 그럼으로 대용량 데이터 처리 할 때 용이하다
  • 단점
    • 데이터 삽입 시 데이터의 마지막 위치를 파악해야 한다.
    • 레코드 재 구성 시 느리다.
      • 각 행에서 세그먼트를 하나씩 읽어야 하기 때문
    • 파일을 읽기 전에 메타 정보를 읽고 행을 재 구성하기 때문에 CPU/ RAM등 리소스 소모가 더 크다

결론

결론적으로 Row Oriented와 Col Oriented는 아래와 같은 차이를 보인다.
어떤 것이 100%더 좋다는 없다고 생각한다.
단지 어떤 상황에 어떤 것이 더 적합한 것만 있는 것 같다.
Pasted image 20231206155149.png

[ Reference ]


개인적으로 공부한 내용 포스팅 중
잘못된 정보는 지적해주시면 좋겠습니다!

+ Recent posts