비밀번호

커뮤니티2

  • 맑음속초24.2맑음북춘천22.3맑음철원20.1맑음동두천19.5맑음파주19.2맑음대관령16.6맑음춘천21.7맑음백령도17.6맑음북강릉24.8맑음강릉24.4맑음동해25.5맑음서울20.4맑음인천16.4맑음원주21.4구름조금울릉도16.2맑음수원20.7맑음영월20.7맑음충주22.5맑음서산18.0맑음울진24.7맑음청주23.3맑음대전21.3맑음추풍령20.8맑음안동22.9맑음상주22.2맑음포항24.9맑음군산19.1맑음대구25.5맑음전주21.4맑음울산19.6맑음창원21.7맑음광주21.7맑음부산19.6맑음통영20.0맑음목포19.5맑음여수20.1맑음흑산도18.6맑음완도21.4맑음고창20.0맑음순천21.7맑음홍성18.8맑음서청주21.3맑음제주20.8맑음고산19.1맑음성산20.8맑음서귀포19.8맑음진주22.4맑음강화16.3맑음양평21.9맑음이천22.0맑음인제21.5맑음홍천22.3맑음태백19.1맑음정선군22.0맑음제천20.4맑음보은21.3맑음천안21.4맑음보령16.5맑음부여20.2맑음금산20.3맑음세종21.6맑음부안21.0맑음임실20.9맑음정읍21.5맑음남원22.5맑음장수19.7맑음고창군21.2맑음영광군18.8맑음김해시21.8맑음순창군22.2맑음북창원22.2맑음양산시21.5맑음보성군22.8맑음강진군22.6맑음장흥21.8맑음해남20.0맑음고흥22.5맑음의령군23.5맑음함양군23.2맑음광양시23.6맑음진도군18.5맑음봉화20.6맑음영주21.3맑음문경22.0맑음청송군22.3구름조금영덕23.1맑음의성23.4맑음구미23.4맑음영천23.7맑음경주시25.0맑음거창22.1맑음합천25.1맑음밀양24.3맑음산청23.7맑음거제18.6맑음남해21.3맑음북부산20.5
  • 2024.05.09(목)

데이터 엔지니어링데이터 엔지니어링

Python pandas 모듈의 DataFrame 객체를 Google Bigquery로 로드하기

Python에서 pandas 모듈로 생성환 DataFrame 객체를 그대로 BigQuery로 로드할 경우

구글에서 제공하는 google-cloud-bigquery SDK를 사용하거나,

타사에서 제공하는 pandas-gbq 모듈을 사용할 수 있다.

 

1. pandas-gbq

임의의 데이터를 가진 DataFrame 인스턴스 df가 있다고 가정할 때,

데이터프레임 인스턴스에서 바로 to_gbq 메소드를 호출하여 빅쿼리로 데이터프레임의 내용을 로드할 수 있다.

프로젝트안에 데이터셋, 테이블이 존재하지 않을 경우 자동으로 생성하며 if_exists로 테이블이 존재할 경우의 행동도 정의할 수 있다.

 

table_schema를 기입하지 않을 경우 데이터프레임으로부터 스키마 추론 방식:

 
 

dtype

 

BigQuery Data Type

 

i (integer)

INTEGER

b (boolean)

BOOLEAN

f (float)

FLOAT

O (object)

STRING

S (zero-terminated bytes)

STRING

U (Unicode string)

STRING

M (datetime)

TIMESTAMP

 

 

credentials, destination_table 등의 기본적인 정보만 세팅하면 간단하게 빅쿼리로 데이터를 로드할 수 있으나, 내부적으로는 데이터프레임으로부터 로컬에 임시 csv 파일을 생성하고, 이를 빅쿼리에 로드하는 방식으로 영문 컬럼명이 아닐 경우 인코딩 문제, 데이터프레임에서 NaN 결측치가 포함된 컬럼의 경우 NaN은 부동소수 데이터타입으로 컬럼 데이터타입이 integer가 될 수 없는 문제 등 몇가지 단점이 존재함

이외에도 read_gbq 메소드로 빅쿼리의 데이터를 가져오는 메소드도 존재

 

2. google-cloud-bigquery SDK

SDK를 통해 직접 데이터를 로드하는 방식

pandas-gbq와 동일하게 스키마 정의에서 컬럼의 데이터타입을 추론할 수 있으나, 의도치 않은 결과가 발생할 수 있으므로 스키마는 직접 정의하는게 좋음

워크플로우는 다음과 같음

- credentials json파일 또는 직접 정의된 dict로 인증하여 bigquery.Client 객체 생성

- credentials의 project에 데이터셋, 테이블 존재여부 확인 및 생성

- 데이터프레임으로부터 테이블 생성시 사용할 스키마 정의

- 스키마가 정의된 테이블로 데이터 로드

 

마지막 단계에서 데이터를 로드할 경우 사용할 수 있는 방식은 다음과 같음

bigquery.Client 인스턴스를 client라 할 때

- client.insert_rows_from_dataframe 메소드 사용

- client.insert_rows_from_json 메소드 사용

insert_rows_from_dataframe 메소드의 경우 pandas-gbq 모듈에서 발생한 문제가 동일하게 생길 수 있으므로

insert_rows_from_json 메소드 사용 추천

 

임의의 데이터를 가진 DataFrame 인스턴스 df가 있다고 가정할 때,

주의할 점은 dict 객체를 json 형태로 로드하게 되는데, 이때 객체가 포함될 경우 serialize가 불가능하므로 예외가 발생함

특히 pd.Timestamp 시계열 데이터, NaN(numpy) 등이 객체타입이므로 해당 데이터들은 문자열 등의 타입으로 변환하고 dict 객체로 캐스팅해야함(NaN의 경우 None으로 대체)

로드가 모두 성공적으로 끝났다면 errors는 빈 배열이며, 로드 과정에서 문제가있는 row가 에러메시지와 함께 errors에 담기게 되므로 이를 통해 후처리를 진행

 

2-2. 

insert_rows_from_*은 대량의 데이터를 업로드할 시 오류가발생함

구글 빅쿼리 SDK로 LoadJob을 생성하여 테이블 로드를 진행

해당 작업은 SDK 내에서 비동기적으로 진행되며 result 메소드는 해당 작업이 완료될 때 까지 대기 후에 실행 결과를 반환

전체댓글0

검색결과는 총 12건 입니다.    글쓰기
1