pandas에서 DataFrame을 DB로 insert 시키고 싶을때 여러가지 방법이 있다.

 

원래는 파일형식의 hive DB를 사용하다가 ICEBERG로 옮기게 되었는데, ICEBERG에서는 MinIO로 parquet를 밀어넣는 방식을 사용하지 않는다. 귀찮..

 

그래서 속도가 좀 느려지지만 to_sql 방식을 사용해서 Pandas DataFrame을 그대로 insert 해보았다.

 

1. [SQL] ICEBERG DB로 테이블을 생성 

CREATE TABLE ICEBERG.schema.table (
	ANL_DT 	VARCHAR(10),
	a		VARCHAR(9),
	b		VARCHAR(18),
	c		VARCHAR(100),
	create_date  	date
)
WITH (
   format = 'parquet',
   location = 's3a://bucket/iceberg/schema/DM_PMI_MDL_OUT'
)
;

 

 

2. [Python] DB Connect / engine 만들기

import sqlalchemy

def conn():
    return connect(
        user="...",
        http_scheme="https",
        auth=BasicAuthentication("///", "///"),
        host="...",
        port= ... ,
        catalog= "iceberg",
        schema= "..." 
        )

engine = sqlalchemy.create_engine('trino://', creator=conn)

 

trino를 사용하였기 때문에 .create_engine url 부분에 trino://를 사용하였다.

 

3. [Python] to_sql 매서드 적용

 

df.to_sql('table', con=engine, schema = 'schema',if_exists='append',chunksize = 5000, method = 'multi', index = False)

 

chunksize를 적절히 설정하고 method를 multi로 설정한다.

 

 1) chuksize : 각 배치때마다 한번에 written 할 row 수, 설정 안할 경우 한번에 하나씩 written됨

 2) method 

    ① multi: mutilple하게 insert

    ② None: 설정 안할령우 한번에 하나씩 insert 

 

 

 

+ ) 속도 튜닝은 아직 안해봐서 좀 느린듯 함

 

python에서 작업하다보면 빨간색 warning이 뜰때가있음

진짜 버그일수도 있지만, 판다스 plot찍다가도 워닝 뜨는 케이스들이 있어서 

주피터로 자료만들때 보기싫게 더러워지는 케이스들도있음

import warnings

warnings.filterwarnings('ignore')

 

해버리면 warning이 안뜬다!

 

Python에서 isin 구문은 열이 list의 값을 포함하고 있는 행을 찾을 때 사용

 

인덱스기준으로도 사용이 가능하다

 

예시

import pandas as pd

test = pd.DataFrame({'A': [1, 2, 3, 0], 'B': ['a', 'b', 'f', 'e']})

index기준으로 0과 3에 해당하는 컬럼만 추출하고싶은경우

index_test= [0,3] #인덱스 리스트
test[test.index.isin(index_test)]

 

인덱스가 0과3이 아닌것을 추출하고싶은 경우

index_test= [0,3]
test[~test.index.isin(index_test)]

 

특정 컬럼기준으로 추출하고싶은 경우

a_1= [1]
test[test['A'].isin(a_1)]

 

^^

기본적으로 사용하는 사이킷런의 train_test_split을 하다가 에러가 발생하였다.

 

<train_test_split 코드>

train_X, test_X, train_y, test_y = train_test_split(X, y, stratify = y, test_size=0.3, random_state=42)

 

<에러 코드>

TypeError: '<' not supported between instances of 'str' and 'NoneType'

 

 

찾아보니 리스트 정렬시에 None이포함되어있을경우 발생하는 에러라고 한다.

 

<해결방법>

y에 결측치를 제거한 후 다시 수행한다! 

df= df.dropna(subset = ['y'])

 

 

쿼리를 짜다보니 일부 조건들에 걸려서 

SQL Error [22012]: ERROR: division by zero 가 떨어지는 경우가 있다.

 

말 그대로 0으로 나눠서 에러가 나는것인데, 여러가지 해결방법이 있지만 자주 쓰는 방법을 정리 해 보았다.

 

1. NULLIF(컬럼, 0)

 

SELECT 1*2 / NULLIF(0,0) - 0

결과값: NULL

 

2. CASE 문 사용

SELECT CASE WHEN COL > 0 
        THEN (1*2/COL)
        ELSE 0
        END AS RESULT_COL

col값이 0초과일때만 div가 진행되기 때문에 에러가 나타나지 않는다.

 

데이터 프레임에서 필터링 조건을 통하여 특정행/열의 값을 가지고 오는 코드를 작성했다.

셀값만 꺼내고싶은데 필터링 기능을 활용하면 데이터프레임 형식으로밖에 꺼내지지 않는다.

 

필터링 코드

a = table['type'][table['COLUMN_NAME'] == col]

결과값

[2] -0.133653

 

-0.133653값만 꺼내고싶은 경우는 간단하게 .iloc로 슬라이싱해서 가지고 오면 된다. 

 

a = table['type'][table['COLUMN_NAME'] == col].iloc[0]

 

EC2 서버 위 Jupyter Notebool 가상환경에서 Parquet파일 읽기

 

import pandas as pd

data = pd.read_parquet('경로')

 

 

Apache Parque

Apache Parque는 효율적인 데이터 스토리지와 검색을 지원하도록 설계되었으며,

컬럼 중심의 오픈 소스 데이터 파일이다. 

 

 

특징

  • 무료 오픈 소스 파일 형식
  • 언어를 가리지 않음
  • 컬럼 기반 형식 - 파일이 행이 아니라 열로 구성되어 스토리지 공간이 절약되고 분석 쿼리 속도가 향상된다.
  • OTLP 데이터베이스와 함께 사용하는 사례에 사용
  • 데이터 압축과 해제의 효율이 매우 높다.

 

장점

  • 모든 종류의 빅데이터를 저장하는데 적합 (구조적 데이터 테이블, 이미지, 동영상, 문서)
  • 매우 효율적인 컬럼 전체 압축 방식, 그리고 다양한 데이터 유형의 컬럼에 대한  유연한 인코딩 방식을 사용하여 클라우드 스토리지에 저장
  • 데이터 건너뛰기 등의 기술을 사용하여 데이터 처리량과 성능을 높임

Parquet와 CSV의 차이점

Data set Amazon S3에서 크기 쿼리 런타임 스캔한 데이터 비용
CSV 1TB 236s 1.15TB $5.75
Apache Parquet 130GB 6.78s 2.51GB $0.01

 

 

 

* databricks에서 내용 참고했음을 밝힙니다.  (https://www.databricks.com/kr/ )

+ Recent posts