비밀번호

커뮤니티2

  • 맑음속초13.3맑음북춘천3.0맑음철원2.7맑음동두천4.3맑음파주5.3맑음대관령6.4맑음춘천3.1황사백령도10.8황사북강릉11.5맑음강릉13.0맑음동해13.5황사서울7.6황사인천8.1맑음원주4.1황사울릉도12.1맑음수원5.9맑음영월3.0맑음충주3.7맑음서산2.9맑음울진10.3황사청주5.9황사대전5.1맑음추풍령2.5황사안동5.0맑음상주5.4황사포항9.4맑음군산4.6황사대구8.4황사전주4.7황사울산8.7황사창원10.8황사광주6.8구름많음부산11.1구름많음통영8.9황사목포6.8황사여수8.6황사흑산도7.4구름많음완도6.4맑음고창2.8구름많음순천7.0황사홍성5.2맑음서청주3.4황사제주9.7맑음고산10.0구름많음성산10.9구름많음서귀포13.7구름많음진주7.2맑음강화7.5맑음양평4.1맑음이천4.2맑음인제4.5맑음홍천2.9맑음태백9.0맑음정선군3.2맑음제천2.0맑음보은1.4맑음천안2.7맑음보령3.9맑음부여2.3맑음금산1.8맑음세종3.0맑음부안5.0구름많음임실0.9맑음정읍3.8구름많음남원2.6구름많음장수0.0맑음고창군4.5구름많음영광군3.4구름많음김해시10.8구름많음순창군2.7구름많음북창원10.7구름많음양산시11.9구름많음보성군6.4구름많음강진군5.3구름많음장흥4.0흐림해남5.6구름많음고흥4.3구름많음의령군4.3구름많음함양군2.2구름많음광양시6.8흐림진도군7.8맑음봉화2.0맑음영주4.2맑음문경4.3맑음청송군3.1구름많음영덕8.8맑음의성3.4맑음구미6.5맑음영천6.8구름많음경주시8.7구름많음거창2.5구름많음합천4.7구름많음밀양9.3구름많음산청4.7구름많음거제11.8구름많음남해10.0구름많음북부산11.9
  • 2026.04.21(화)

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

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

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