decimal -> int 변환했을 때 음수 나오는 이유

2024. 6. 25. 17:52·Data Engineering/Spark
728x90
반응형

문제 상황

ORACLE에 있는 테이블을 spark dataframe로 변환했다. ORACLE의 NUMBER 형 데이터 타입이 SPARK 에서는 DECIMAL 데이터 타입으로 바뀌었는데, 소수점이 생겨서 보기 불편하였다. 데이터를 식별하는 PK 값에 소수점이 잔뜩 붙어 버리니 데이터가 예쁘지 않았다.

 

ex) ORACLE: 202401010000

SPARK DATAFRAME: 202401010000.0000000000

 

소수점이 필요한 데이터가 아니어서 해결 방법을 찾아 보았다.

 

문제 발생 원인

decimal 데이터 타입으로 변한 이유는, 스파크 데이터프레임으로 변환할 때 따로 스키마 설정을 안 해 주었기 때문이다. 스키마 지정을 하지 않으면 스파크는 숫자형 데이터를 임의로 decimal 데이터 타입으로 바꾸어 소수점과 자릿수를 자기 마음대로 추정하여 설정한다.

 

테이블이 한두 개이면 스키마를 설정하여 decimal 의 소수점을 0으로 만들어 버리면 되지만 프로세스를 거칠 테이블이 워낙 많고, 앞으로도 많은 양의 테이블이 계속 추가될 것이기 때문에 매번 스키마를 설정하여 스파크로 넘기는 것은 힘들다고 생각했다.

 

예를 들어 지금 200개의 테이블이 있다고 하면 200개 테이블의 스키마를 일일이 지정하고 테이블이 추가될 때마다 넘버 타입의 데이터가 있는지 없는지 확인하고, 있으면 또 스키마를 지정해서 소수점을 없애 줘야 한다.

 

해결 방법

  1. 1. ROUND()나 FLOOR() 를 사용하여 반올림, 반내림 하는 방법
  2. 2. int 형으로 데이터 타입 변환하기 (CASTING)

 

나는 2번을 선택했다. 1번으로도 시도해 봤지만 알 수 없는 오류(?)로 서버에서는 잘 되지 않았다. 그리고 없던 소수점 아래 자리가 생긴 거니까 그냥 버림을 하는 게 맞다 생각했다. 괜히 내림이나 올림을 해서 데이터 오염이 될 수도 있다고 생각했다. 물론 소수점은 다 0으로 되어 있지만 정말 혹시 모르니까!! 그냥 버리고 싶었다.

 

int형으로 변환하면 쉽게 해결할 수 있을 거라 생각했는데 또 난관이 있었다. int로 변환했더니 웬 알 수 없는 음수가 등장했다. 음수가 나온 이유는 int가 표현할 수 있는 범위를 넘어서서 오버플로우가 발생한 거였다. 데이터를 보니 12자리 숫자였고, 이는 int가 표현하지 못하는 숫자였다.

int와 long의 차이

형식 이름 바이트 값의 범위
int 4 -2,147,483,648 ~ 2,147,483,647
long 8 0 ~ 18,446,744,073,709,551,615

해당 범위는 64 bit 기준이다. int는 대략 9자리 수와 10 자리 수 일부밖에 표현하지 못한다. 그에 비해 long 타입은 훨씬 많은 범위의 숫자를 표현할 수 있다.

 

작성 코드

def remove_decimals(self, dataframe):
	for column_name, dtype in dataframe.dtypes:
    	if 'decimal' in dtype:
        	dataframe=dataframe.withColumn(column_name, dataframe[column_name].cast("bigint"))
	return dataframe

위는 테이블에서 decimal 형태인 컬럼을 찾고, 이를 long 타입 데이터로 변환하는 함수이다.

 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

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

Kafka + Elastic Search + Spark Structured Streaming 연동하기  (0) 2025.02.07
[SPARK/Python] 파이썬에서 스파크로 함수 전달하는 방법  (0) 2024.05.29
[Spark/Airflow] Airflow Dag 비활성화했는데도 스케줄링 도는 경우  (0) 2024.05.03
[Spark] decimal 데이터 타입  (0) 2024.03.29
'Data Engineering/Spark' 카테고리의 다른 글
  • Kafka + Elastic Search + Spark Structured Streaming 연동하기
  • [SPARK/Python] 파이썬에서 스파크로 함수 전달하는 방법
  • [Spark/Airflow] Airflow Dag 비활성화했는데도 스케줄링 도는 경우
  • [Spark] decimal 데이터 타입
Jaeyeon-Choi
Jaeyeon-Choi
데이터 엔지니어 호소인의 시행착오
    반응형
  • Jaeyeon-Choi
    데엔데엔
    Jaeyeon-Choi
  • 전체
    오늘
    어제
    • 분류 전체보기 (50)
      • 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)
      • 주간 · 월간 회고 (6)
      • 생각 (1)
        • 기타 (1)
        • 뉴스 (0)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
Jaeyeon-Choi
decimal -> int 변환했을 때 음수 나오는 이유
상단으로

티스토리툴바