fra*_*ows 5 validation google-bigquery
我正在设置一个每日 cron 作业,将一行附加到 BigQuery 表(使用 Python),但是,正在插入重复的数据。我在网上搜索过,我知道有一种方法可以手动删除重复数据,但我想看看是否可以首先避免这种重复。
\n\n有没有办法先检查 BigQuery 表以查看数据记录是否已存在,以避免插入重复数据?谢谢。
\n\n代码片段:
\n\nimport webapp2\nimport logging\nfrom googleapiclient import discovery\nfrom oath2client.client import GoogleCredentials\n\nPROJECT_ID = \'foo\'\nDATASET_ID = \'bar\'\nTABLE_ID = \'foo_bar_table\xe2\x80\x99\n\nclass UpdateTableHandler(webapp2.RequestHandler):\n def get(self):\n credentials = GoogleCredentials.get_application_default()\n service = discovery.build(\'bigquery\', \'v2\', credentials=credentials)\n\n try:\n\n the_fruits = Stuff.query(Stuff.fruitTotal >= 5).filter(Stuff.fruitColor == \'orange\').fetch();\n\n for fruit in the_fruits:\n #some code here\n\n basket = dict()\n basket[\'id\'] = fruit.fruitId\n basket[\'Total\'] = fruit.fruitTotal\n basket[\'PrimaryVitamin\'] = fruit.fruitVitamin\n basket[\'SafeRaw\'] = fruit.fruitEdibleRaw\n basket[\'Color\'] = fruit.fruitColor\n basket[\'Country\'] = fruit.fruitCountry\n\n body = {\n \'rows\': [\n {\n \'json\': basket,\n \'insertId\': str(uuid.uuid4())\n }\n ]\n }\n\n response = bigquery_service.tabledata().insertAll(projectId=PROJECT_ID,\n datasetId=DATASET_ID,\n tableId=TABLE_ID,\n body=body).execute(num_retries=5)\n logging.info(response)\n\n except Exception, e:\n logging.error(e)\n\napp = webapp2.WSGIApplication([\n (\'/update_table\', UpdateTableHandler),\n], debug=True)\nRun Code Online (Sandbox Code Playgroud)\n
测试数据是否已存在的唯一方法是运行查询。
如果表中有大量数据,该查询可能会很昂贵,因此在大多数情况下,我们建议您继续插入重复项,然后稍后合并重复项。
正如 Zig Mandel 在评论中建议的那样,如果您知道希望看到记录的日期,则可以查询日期分区,但这与插入和删除重复项相比仍然可能很昂贵。