2016-10-04 28 views
0

BigQueryテーブルにPythonを使用して行を追加する毎日のcronジョブを設定していますが、重複データが挿入されています。私はオンラインで検索しましたが、手動で方法があることを知っていますremove duplicateデータが、私は最初にこの重複を避けることができるかどうかを見たいと思った。BigQueryテーブルに挿入する前にデータが存在するか確認してください(Pythonを使用)

データレコードが既に存在するかどうかを確認する方法はありますか最初に重複データが挿入されないようにするにはどうすればよいですか?ありがとう。

コードスニペット:

import webapp2 
import logging 
from googleapiclient import discovery 
from oath2client.client import GoogleCredentials 

PROJECT_ID = 'foo' 
DATASET_ID = 'bar' 
TABLE_ID = 'foo_bar_table’ 

class UpdateTableHandler(webapp2.RequestHandler): 
    def get(self): 
     credentials = GoogleCredentials.get_application_default() 
     service = discovery.build('bigquery', 'v2', credentials=credentials) 

    try: 

    the_fruits = Stuff.query(Stuff.fruitTotal >= 5).filter(Stuff.fruitColor == 'orange').fetch(); 

    for fruit in the_fruits: 
     #some code here 

    basket = dict() 
    basket['id'] = fruit.fruitId 
    basket['Total'] = fruit.fruitTotal 
    basket['PrimaryVitamin'] = fruit.fruitVitamin 
    basket['SafeRaw'] = fruit.fruitEdibleRaw 
    basket['Color'] = fruit.fruitColor 
    basket['Country'] = fruit.fruitCountry 

      body = { 
       'rows': [ 
        { 
         'json': basket, 
         'insertId': str(uuid.uuid4()) 
        } 
       ] 
      } 

      response = bigquery_service.tabledata().insertAll(projectId=PROJECT_ID, 
                   datasetId=DATASET_ID, 
                   tableId=TABLE_ID, 
                   body=body).execute(num_retries=5) 
      logging.info(response) 

    except Exception, e: 
     logging.error(e) 

app = webapp2.WSGIApplication([ 
    ('/update_table', UpdateTableHandler), 
], debug=True) 
+0

データが過去24時間以内に検索されない限り、そのパーティションのみを検索するのは費用がかかるようです。 –

答えて

1

データが既に存在するかどうかをテストする唯一の方法は、クエリを実行することです。

テーブルに大量のデータがある場合、そのクエリは高価になる可能性があります。ほとんどの場合、重複を挿入して後で重複をマージすることをお勧めします。

ジグマンデルはコメントで、レコードを表示すると予想される日付を知っていても、重複の挿入や削除に比べて高価な場合があることをコメントで示唆しています。

関連する問題