2

私のpythonプロジェクトでは、リレーショナルデータフレームを持つbigqueryテーブルを作成する必要があります。私は最初から新しいテーブルを作成し、そこにアップロードした最初のデータが実際にテーブルに入れられていることを確認することに多くの問題があります。Bigquery(とpandas) - データの一貫性を保証する

私はhttps://cloud.google.com/bigquery/streaming-data-into-bigquery#dataconsistencyのページを読んでおり、挿入クエリにinsertIdを適用すると問題は解決するが、pandasのデータフレームを使用しているので、pandas-gbqパッケージのto_gbq関数がこのタスクに最適だと思われる。しかし、to_gbq関数を使用して新しいテーブルが作成/置換されると、最初のデータチャンクが(明らかにランダムに)テーブルに書き込まれないことがあります。

誰かがbigqueryの新しい作成テーブルにDataFrameを完全に挿入する方法を知っていますか?ありがとう

答えて

2

私はあなたがhttps://github.com/pydata/pandas-gbq/issues/75が発生していると信じています。基本的に、PandasはBigQueryストリーミングAPIを使用してテーブルにデータを書き出しますが、ストリーミングAPIはテーブルの作成後に作業が開始されるまでに遅延があります。

編集:バージョン0.3.0のpandas-gbqは、ストリーミングではなく、データをアップロードするためのロードジョブを使用してこの問題を修正しています。

その間、「ロードジョブ」を使用してテーブルを作成することをおすすめします。たとえば、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

ご回答ありがとうございます。私はパンダを使用してすぐにこれが修正されることを願っています '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 –

関連する問題