[Spark] decimal 데이터 타입

2024. 3. 29. 16:49·Data Engineering/Spark
728x90
반응형

Oracle DB에서 NUMBER 데이터 타입이던 컬럼이 Spark dataframe으로 변환하면 decimal 데이터 타입으로 바뀌어서 찾아보았다.

 

Decimal Type, Long Type, Double Type

Oracle 데이터베이스에 있는 NUMBER 데이터 타입을 Spark dataframe으로 변환하게 되면 기본적으로 decimal 데이터 타입으로 매핑되어 변환된다.  decimal 외에 Long Type과 Double Type으로 변환할 수 있다.

 

  • Decimal Type
    • 숫자를 소수점까지 아주 정확하게 표현할 수 있다.
    • 최대 유효 숫자를 제공한다.
    • 그만큼 연산도 정확하게 할 수 있다. 소수점 하나에도 민감한 재무 데이터에 많이 쓰인다.
    • 단 숫자가 많이 필요하다.

 

  • Long Type
    • Java의 long과 유사한 타입이다.
    • 64비트 정수를 나타낸다.
    • 소수점 이하의 값을 표현하지 않고, 정수 값만 저장한다.
    • 범위는 대략 -9,223,372,036,854,775,808부터 9,223,372,036,854,775,807까지이다. 

 

  • Double Type
    • Java의 double과 유사한 타입이다.
    • 64비트 부동 소수점 숫자를 나타낸다.
    • 소수점 이하의 값을 포함한 실수 값을 저장한다.
    • 더 넓은 범위의 수를 다룰 수 있으며 정밀도도 높다.

 

Spark 데이터프레임에서 자주 쓰이는 수치형 데이터 타입은 decimal, long, double인 것 같은데, double은 현재 다루고 있는 데이터 타입에 굳이 적용할 필요는 없다고 생각했다. 정수만 나타낼 수 있는 long 보다 더 넓은 범위의 수를 다룰 수 있는 것은 맞지만 double보다 더 정교한 값을 낼 수 있는 decimal 타입을 두고 굳이..? 그리고 통계나 인공지능 모델에 사용될 수도 있기에 소수점 계산에는 더더욱 decimal을 쓰는 게 나은 것 같다. Double 데이터 타입은 연산이 될수록 결과가 산으로 가는 것 같달까..

 


Decimal의 정밀도와 스케일

어떤 컬럼은 decimal(38,10) 또 어떤 컬럼은 decimal(12,0)으로 변환되길래 찾아봤더니 또 임의로 판단해서 바꾸는 거란다. 괄호 안에 있는 숫자가 의미하는 건 정밀도와 스케일이다. 즉 38이 정밀도(precision)이고, 10이 스케일(scale)이다.

 

  • 정밀도(precision)
    • 소수점을 포함한 숫자의 전체 자릿수
    • 예를 들어 123.456의 경우 정밀도는 6이다.

 

  • 스케일(scale)
    • 소수점 아래의 자릿수
    • 123.456의 경우 스케일은 3이다.

 

연산이 필요하지 않은 데이터를 Decimal로?

컬럼 중 연산이 굳이 필요하지 않은 컬럼이 있는데, 이게 decimal(38,10)으로 바뀌니까 보기가 불편하다. 단지 데이터들을 구분하는 하나의 pk값인데, 123456 이렇게 떨어지면 될걸 123456.0000000000 이런 식으로 보여지니까 거슬린다. 이것 말고도 몇 개의 컬럼이 더 있기는 한데, 이 컬럼은 연산이 필요한지 안 필요한지 더 들여다 봐야 할 것 같다.

 

연산이 필요한 컬럼의 경우 스케일을 0으로 지정해 버리면 연산의 결과 값도 스케일이 0이 되어 소수점을 다 버리게 된다. decimal(10,0)과 decimal(10,0)인 컬럼끼리 연산할 경우 정수만 남는 것이다.

 


Decimal 검색(Select)

값이 123456인 데이터를 찾을 때 decimal(38,10)인 데이터를 어떻게 찾지? 의문이었는데, 굳이 123456.0000000000 이라고 정확하게 명시하지 않아도 찾을 수 있다고 한다. 그러니까 저 소수점 열 개인 값인 데이터를 SELECT 하고 싶으면 조건에 123456까지만 명시해도 검색 가능하다.

 


해결이 필요한 점

연산이 필요하지 않은 컬럼의 경우 어떻게 처리할 것인지? 변환된 그대로 두면 소수점 아래가 10가 되어 보기에 불편하다. 검색하는 데에 불편함은 없음. 스케일을 0으로 줄이는 과정을 하나 추가하는 게 의미가 있나 싶기도 하다.

 


참고 사이트

  • https://learn.microsoft.com/ko-kr/dotnet/visual-basic/language-reference/data-types/decimal-data-type
  • https://learn.microsoft.com/ko-kr/azure/databricks/sql/language-manual/sql-ref-datatypes
728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'Data Engineering > Spark' 카테고리의 다른 글

Kafka + Elastic Search + Spark Structured Streaming 연동하기  (0) 2025.02.07
decimal -> int 변환했을 때 음수 나오는 이유  (0) 2024.06.25
[SPARK/Python] 파이썬에서 스파크로 함수 전달하는 방법  (0) 2024.05.29
[Spark/Airflow] Airflow Dag 비활성화했는데도 스케줄링 도는 경우  (0) 2024.05.03
'Data Engineering/Spark' 카테고리의 다른 글
  • Kafka + Elastic Search + Spark Structured Streaming 연동하기
  • decimal -> int 변환했을 때 음수 나오는 이유
  • [SPARK/Python] 파이썬에서 스파크로 함수 전달하는 방법
  • [Spark/Airflow] Airflow Dag 비활성화했는데도 스케줄링 도는 경우
Jaeyeon-Choi
Jaeyeon-Choi
데이터 엔지니어 호소인의 시행착오
    반응형
  • Jaeyeon-Choi
    데엔데엔
    Jaeyeon-Choi
  • 전체
    오늘
    어제
    • 분류 전체보기 (49)
      • Python (6)
      • Data Engineering (20)
        • Airflow (3)
        • Spark (5)
        • Infra (6)
        • ElasticSearch (1)
        • Hive (3)
        • etc (1)
      • Docker · Git (11)
      • Study (5)
        • SQL (5)
      • CS (1)
        • 운영체제 (0)
        • 네트워크 (1)
        • 알고리즘 (0)
        • 데이터베이스 (0)
      • 주간 · 월간 회고 (5)
      • 생각 (1)
        • 기타 (1)
        • 뉴스 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    docker
    Spark
    Python
    하이브
    SQL
    데이터타입
    nbextensions
    Airflow
    파이썬
    hive
    도커
    nginx
    주피터노트북
    이미지
    엔진엑스
    Oracle
    폐쇄망
    스파크
    데이터엔지니어
    컨테이너
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
Jaeyeon-Choi
[Spark] decimal 데이터 타입
상단으로

티스토리툴바