新的 bigquery 表的“未找到:表”
Posted
技术标签:
【中文标题】新的 bigquery 表的“未找到:表”【英文标题】:"Not found: Table" for new bigquery table 【发布时间】:2015-05-20 11:30:29 【问题描述】:我使用 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 秒。有什么想法吗?
我的 projectId 是stylight-bi-testing
在 10:00 到 12:00(UTC 时间)之间发生了很多故障
【问题讨论】:
您确定将正确的表名传递给插入而不是错误的常量吗?您能否在您的问题中添加项目 ID 以及错误发生的时间,BQ 团队正在检查这些帖子,并将能够进行内部调查。 嘿奔腾,我检查打印了上面给定的“结果”变量,并且创建的 tableId 是相同的。实际上,代码在大约 50% 的时间内工作。我使用的重试次数越多,机会就越高,但我希望有一种可靠的方式来插入数据。 您正在使用流式插入或作业加载? 我用的是流式方法(insertAll) 它是一个全新的表,还是你删除并重新创建它? 【参考方案1】:根据您对我关于使用 NOT_FOUND 作为指标来创建表的问题的回答,这是有意的(尽管诚然有些令人沮丧)行为。
流插入路径缓存有关表的信息(以及用户插入表的授权)。这是因为 API 具有预期的高 QPS 特性。我们还缓存某些负面响应,以再次保护错误或滥用的客户。这些缓存的否定响应之一是目标表不存在。我们一直在每台机器上执行此操作,但最近添加了一个额外的集中式缓存,这样所有机器几乎都会在返回第一个 NOT_FOUND 响应后立即看到否定的缓存结果。
一般来说,我们建议不要在插入请求的同时进行表创建,因为在发出数千个 QPS 插入的系统中,表未命中可能会导致数千个表创建操作,这会对我们的系统造成负担。相反,如果您事先知道可能的表集,我们建议您在将表用作流式传输目的地之前执行一些定期创建表的过程。如果您的目标表在本质上更具动态性,您可能需要在表创建完成后实施延迟。
对遇到的困难表示歉意。我们确实希望解决这个问题,但我们还没有具体的时间表。
【讨论】:
注意...如果您在尝试流式传输到目标之前创建表,则该表立即可用。【参考方案2】:Sean/Nils,即使我也有同样的问题。我先尝试流式插入,如果失败,我继续创建表。但是在创建表之后,流式插入仍然失败了一段时间(~ 30 秒到 4 分钟),并出现错误“找不到表”。在此间隔之后,相同的流式插入将顺利通过。
【讨论】:
以上是关于新的 bigquery 表的“未找到:表”的主要内容,如果未能解决你的问题,请参考以下文章
BigQuery 表的扁平数据并将扁平数据复制到新的 BigQuery 表