2

제 Python 프로젝트에서 관계형 데이터 프레임을 사용하여 bigquery 테이블을 채울 필요가 있습니다. 새 테이블을 처음부터 만들고 처음 업로드 한 데이터가 테이블에 실제로 저장되는지 확인하는 데 많은 어려움을 겪고 있습니다.Bigquery (and pandas) - 데이터 삽입 일관성 보장

나는 https://cloud.google.com/bigquery/streaming-data-into-bigquery#dataconsistency 페이지를 읽고 삽입 쿼리에 insertId를 적용하면 문제를 해결할 수 있지만 팬더의 데이터 프레임을 사용하기 때문에 pandas-gbq 패키지의 to_gbq 기능이이 작업에 완벽하게 보입니다. . 그러나 to_gbq 함수를 사용하고 새 테이블을 작성/교체 할 때 첫 번째 데이터 청크가 (분명히 무작위로) 테이블에 기록되지 않는 경우가 있습니다.

누가 새 테이블 bigquery에 DataFrame의 완전 삽입을 보장하는 방법을 알고 있습니까? 감사합니다

답변

2

나는 당신이 https://github.com/pydata/pandas-gbq/issues/75을 만날 것으로 생각합니다. 기본적으로 Pandas는 BigQuery 스트리밍 API를 사용하여 테이블에 데이터를 쓰지만 스트리밍 API는 테이블 생성 후 작업이 시작될 때까지 지연됩니다.

편집 : 버전 0.3.0 :버전 스트리밍 대신 데이터 작업을로드하기 위해로드 작업을 사용하여이 문제를 해결합니다.

그 사이에 "로드 작업"을 사용하여 테이블을 만드는 것이 좋습니다. 예를 들어 google-cloud-bigquery 패키지의 client.load_table_from_file 메서드를 사용합니다.

from google.cloud.bigquery import LoadJobConfig 
from six import StringIO 

destination_table = client.dataset(dataset_id).table(table_id) 
job_config = LoadJobConfig() 
job_config.write_disposition = 'WRITE_APPEND' 
job_config.source_format = 'NEWLINE_DELIMITED_JSON' 
rows = [] 

for row in maybe_a_dataframe: 
    row_json = row.to_json(force_ascii=False, date_unit='s', date_format='iso') 
    rows.append(row_json) 

body = StringIO('{}\n'.format('\n'.join(rows))) 

client.load_table_from_file(
    body, 
    destination_table, 
    job_config=job_config).result() 

편집 :이 코드 샘플 비 ASCII 문자가 포함 된 열이 실패합니다. https://github.com/pydata/pandas-gbq/pull/108

+1

귀하의 답변에 감사드립니다. 나는 pandas 'to_gbq 함수를 사용하는 것이 매우 편리하기 때문에 곧 수정 될 수 있기를 바랍니다! – user1403546

+1

현재로서는 데이터 삽입의 일관성을 어떻게 보장 할 수 있습니까? (팬더가 아닌 기능도 포함) – user1403546

+1

그 동안 테이블을 만들 때 "로드 작업"을 사용하는 것이 좋습니다. 예를 들어,'google-cloud-bigquery' 패키지에서'client.load_table_from_file' 메소드를 사용합니다. https://googlecloudplatform.github.io/google-cloud-python/latest/bigquery/reference.html#google.cloud.bigquery.client.Client.load_table_from_file –