"Not found: Table" 用于新的 bigquery table

"Not found: Table" for new bigquery table

我使用 python sdk 创建一个新的 bigquery table:

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 创建的 table 信息 - 因此我假设 table 已正确创建。

之后我什至得到 table,当我调用 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 给出的时间)

Sean/Nils,我也有同样的问题。我首先尝试流式插入,如果失败,我继续创建 table。但是在创建 table 之后,流式插入仍然失败了一段时间(约 30 秒到 4 分钟)并出现错误 "Table not found"。在此间隔之后,相同的流式插入将毫无问题地通过。

根据你对我关于使用 NOT_FOUND 作为指标来创建 table 的问题的回答,这是有意的(虽然公认有些令人沮丧)行为。

流式插入路径缓存有关 table 的信息(以及用户插入 table 的授权)。这是因为 API 的预期高 QPS 性质。我们还缓存某些负面响应,以再次保护有缺陷或滥用行为的客户。其中一个缓存的否定响应是目的地不存在 table。我们一直在每台机器上这样做,但最近添加了一个额外的集中式缓存,这样所有机器都会在返回第一个 NOT_FOUND 响应后几乎立即看到负面缓存结果。

一般来说,我们建议 table 创建不要与插入请求内联,因为在发出数千 QPS 插入的系统中,table 未命中可能会导致数千 table 创建操作可能会对我们的系统造成负担。相反,如果您事先知道可能的 table 集合,我们建议使用一些周期性进程,在将它们用作流媒体目的地之前执行 table 创建。如果您的目的地 table 本质上更具动态性,您可能需要在执行 table 创建后实施延迟。

对困难表示歉意。我们确实希望解决这个问题,但我们还没有任何时间表。