요즘 많은 쿼리 성능과 같은 많은 이점 때문에 데이터 분석시 google BigQuery로 데이터를 이전하는 경우가 많다.
이때 테이블 하나하나 생성후 데이터를 옮기는 작업 자체는 어렵지 않지만 생각보다 고된 작업이 이어진다.
물론 제가 겪은 일입니다ㅎㅎ... 데이터를 안전하고 쉽게 옮기기 위한 tip을 공유합니다.
과정은 아래와 같습니다.
1. 옮기자 하는 대상인 rdbms 테이블 정보를 모두 가져옵니다.
2. 원하는 target을 선택합니다.
3. bigquery api client를 연결한뒤 이전을 시작합니다.
1단계
from sqlalchemy import create_engine
# sqlalchemy의 create_engine 메서드를 사용하여 db를 연결시킵니다.
RDS_ENGINE = create_engine('database_engine://ID:PASSWORD@host:port/database명')
# 모든 테이블 목록 조회
query = '''
SHOW TABLES;
'''
tables = pd.read_sql(query, con=RDS_ENGINE)
# 본인이 옮기고자 하는 테이블의 index를 제외한 목록을 모두 drop 합니다.
# 이건 방법이 여러가지라 target_tables에 target들만 남기면됩니다.
target_tables = tables.drop(index)
2단계
import google
# 이작업을 하기 위해서는 google_account_key가 필요합니다.
# 작업 환경의 환경변수에서 path를 설정해줄수 있습니다.
# GOOGLE_APPLICATION_CREDENTIALS=/Users/~~/google_secret.json
# 위와 같이 GOOGLE_APPLICATION_CREDENTIALS에 본인이 원하는 path를 설정해 키를 위치해줍니다.
credentials, project = google.auth.default(
scopes=["https://www.googleapis.com/auth/bigquery"]
)
client = bigquery.Client(project=project, credentials=credentials)
3단계
for i in target_tables.index:
target = target_tables[i]
schema = f'''
SELECT *
FROM {target}
'''
try:
for chunk in pd.read_sql(schema, con=engine, chunksize=50000):
print(target, len(chunk))
df = pd.DataFrame(chunk)
df.to_gbq(f'dataset이름.{target_ph}', project_id=project, credentials=credentials, if_exists='append', chunksize=50000)
except Exception as e:
print(target)
print(e)
continue
한숨자고 일어나면 됩니다. 여기서 알아야하는것은 주의해야할것은 if_exists인데 ['replace', 'fail', 'append']가 있습니다.
셋다 모두 테이블이 없다면 생성후 문제가 없지만
1. append: 기존의 테이블의 정보를 변경하지 않고 dataframe을 테이블에 append 즉 추가만 진행합니다.
2. replace: 기존에 테이블이 있다면 dataframe으로 모두 대체해버립니다.
3. fail: 기존에 테이블이 있다면 실패로 처리됩니다.
위와 같이 동작하기 때문에 반드시 주의해야합니다.
물론 모두 완벽하게 테이블 생성뒤 이관된다면 좋겠지만 특수한 사항에 에러가 발생하므로 주의해야합니다.
403 Quota exceeded: Your table exceeded quota for imports or query appends per table.
이에러 주의해야합니다...
insert만을 고려한다면 bigquery아주 유용하겠지만 중간중간 데이터의 정보를 변경해줘야 하며 increment_id와 같은 정보가 순차적인 정보가 없다면 테이블이라면 bigquery의 도입을 안하는것을 고려해야합니다.
read_sql, to_gbq 메서드를 사용할때 chunksize를 사용한이유는 아래 글을 참조해주세요... 데이터가 많을때는 왠만하면 꼭사용해주셔야 합니다.
'기술 > database' 카테고리의 다른 글
postgres table join을 이용한 data update (0) | 2023.02.06 |
---|---|
데이터베이스 실행(MYSQL) (0) | 2020.11.16 |
데이터베이스 정의_2(MYSQL) (0) | 2020.11.16 |
데이터베이스의 정의_1(MYSQL) (0) | 2020.11.16 |