在插入 BigQuery 表之前检查数据是否已存在(使用 Python)

fra*_*ows 5 validation google-bigquery

我正在设置一个每日 cron 作业,将一行附加到 BigQuery 表(使用 Python),但是,正在插入重复的数据。我在网上搜索过,我知道有一种方法可以手动删除重复数据,但我想看看是否可以首先避免这种重复。

\n\n

有没有办法先检查 BigQuery 表以查看数据记录是否已存在以避免插入重复数据?谢谢。

\n\n

代码片段:

\n\n
import 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)\n
Run Code Online (Sandbox Code Playgroud)\n

Jer*_*dit 2

测试数据是否已存在的唯一方法是运行查询。

如果表中有大量数据,该查询可能会很昂贵,因此在大多数情况下,我们建议您继续插入重复项,然后稍后合并重复项。

正如 Zig Mandel 在评论中建议的那样,如果您知道希望看到记录的日期,则可以查询日期分区,但这与插入和删除重复项相比仍然可能很昂贵。