我使用 python sdk 创建一个新的 bigquery 表:
tableInfo = {
'tableReference':{
'datasetId':datasetId,
'projectId':projectId,
'tableId':targetTableId
},
'schema':schema
}
result = bigquery_service.tables().insert(projectId=projectId,
datasetId=datasetId,
body=tableInfo).execute()
result
变量包含带有 etag,id,kind,schema,selfLink,tableReference,type
的创建表信息 - 因此我假设表已正确创建。
之后,当我调用 bigquery_service.tables().list(...)
问题是:
在那之后插入时,我仍然(经常)得到一个错误:Not found: MY_TABLE_NAME
我的插入函数调用如下所示:
response = bigquery_service.tabledata().insertAll(
projectId=projectId,
datasetId=datasetId,
tableId=targetTableId,
body=body).execute()
我什至多次重试插入,两次重试之间有 3 秒的 sleep 时间。有什么想法吗?
我的 projectId 是 stylight-bi-testing
在 10:00 到 12:00(以 UTC 给出的时间)之间有很多失败
最佳答案
根据您对我关于使用 NOT_FOUND 作为创建表格的指标的问题的回答,这是有意的(虽然承认有些令人沮丧)行为。
流式插入路径缓存有关表的信息(以及用户插入表的授权)。这是因为 API 的预期高 QPS 性质。我们还缓存某些负面响应,以再次保护有缺陷或滥用行为的客户。其中一个缓存的否定响应是不存在目标表。我们一直以每台机器为基础执行此操作,但最近添加了一个额外的集中式缓存,这样所有机器都会在返回第一个 NOT_FOUND 响应后几乎立即看到否定缓存结果。
一般来说,我们建议表创建不要与插入请求一起发生,因为在发出数千 QPS 插入的系统中,表未命中可能会导致数千个表创建操作,这会给我们的系统带来负担。相反,如果您事先知道可能的表集,我们建议使用一些周期性流程,在将表用作流式传输目的地之前执行表创建。如果您的目标表本质上更动态,您可能需要在执行表创建后实现延迟。
对困难表示歉意。我们确实希望解决这个问题,但我们还没有任何时间表。
关于python - "Not found: Table"用于新的 bigquery 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30348384/