查询多个表到一个

时间:2017-10-08 22:33:27

标签: python google-bigquery

通过这样做,我收到错误Exceeded rate limits: too many table update operations for this table. 我知道,我有表更新限制:

Maximum rate of table update operations: 1 operation every 2 seconds (insert, patch, update, jobs output).

但我的问题是我该如何处理呢?通过在循环中插入作业后添加一些延迟?

我必须从500个联合表(google驱动器表)更新目标表,我不能一次使用wilcards或多个select,因为当一个用户键入字符串到整数字段时,整个查询将因失败解析错误而失败。

所以我决定在python中循环它(然后通过为每个表添加插入作业来创建cron作业)

你知道更有效的方法吗?

已添加Edit1代码

def insert(query, tableid, disposition):
job_body = {
 "configuration": {
  "query": {
   "query": query,
   "useLegacySql": True,
   "destinationTable": {
    "datasetId": "dataset",
    "projectId": "myproject",
    "tableId": tableid
   },
   "writeDisposition": disposition
  }
 }
}

query_request.insert(
    projectId=PROJECT_NUMBER,
    body=job_body).execute()

class MainPage(webapp2.RequestHandler):
def get(self):
    query = "SELECT * FROM [%s]"
    for table in table_list():
        if int(table['id'][-4:]) <= 600:
            insert(query % table['id'], 'users_data_p1', "WRITE_APPEND")
        else:
            insert(query % table['id'], 'users_data_p2', "WRITE_APPEND")


app = webapp2.WSGIApplication([
('/', MainPage),
], debug=True)

1 个答案:

答案 0 :(得分:0)

我们认为你可以尝试构建一个SELECT *的查询,而不是有多个单独的users_data_p1个查询,而每个查询都会尝试附加到两个目标表users_data_p2UNION ALL之一。在所有源表中{1}},然后为WRITE_APPEND执行一次users_data_p1操作,然后为WRITE_APPEND执行另一个users_data_p1操作。这应该可以帮助您完成速率限制。

基本上就是将批处理逻辑添加到脚本中。