【问题标题】:BigQuery: 404 "Table is truncated." when insert right after truncateBigQuery:404“表被截断。”在截断后立即插入时
【发布时间】:2021-11-18 02:41:44
【问题描述】:

我通过执行此处描述的 queryJob 来截断我的表:https://cloud.google.com/bigquery/docs/quickstarts/quickstart-client-libraries

"truncate table " + PROJECT_ID + "." + datasetName + "." + tableName;

我等到工作通过

完成
queryJob = queryJob.waitFor();

截断工作正常。

无论如何,如果我在截断操作之后立即插入

InsertAllResponse response = table.insert(rows);

结果是

com.google.cloud.bigquery.BigQueryException: Table is truncated.

有以下日志:

Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found
    POST https://www.googleapis.com/bigquery/v2/projects/[MYPROJECTID]/datasets/[MYDATASET]/tables/[MYTABLE]/insertAll?prettyPrint=false
    {
      "code" : 404,
      "errors" : [ {
        "domain" : "global",
        "message" : "Table is truncated.",
        "reason" : "notFound"
      } ],
      "message" : "Table is truncated.",
      "status" : "NOT_FOUND"
    }

有时我什至需要在截断和插入之间等待超过 5 分钟。

我想检查我的表格是否仍处于“表格被截断”状态。周期性地直到这个状态消失。

我如何请求 bigquery api 以检查表是否已准备好插入?

我如何请求 bigquery api 来获取表的状态?

编辑

可以在here找到复制示例

【问题讨论】:

  • 能否分享代码以便重现错误?
  • @SandeepMohanty thx,添加了可重现示例的链接

标签: java google-bigquery


【解决方案1】:

如果在流式传输管道仍在继续或对最近截断的表执行流式插入时截断表,您可能会收到问题中提到的一些错误(表被截断),这是预期的行为。 InsertAll(非常高QPS API)的元数据一致性模式是最终一致的,这意味着在使用InsertAll API时,可能会得到延迟的表元数据,并返回表被截断等故障。解决此问题的典型方法是回退并重试。

目前,BigQuery API 中没有用于检查表是否处于截断状态的选项。

【讨论】:

  • 截断时我没有流式传输。我先截断并想在截断后立即插入。遗憾的是 api 没有提供一个端点来检查截断状态:-( 还是谢谢你
  • 嗨@davey,这种不一致也适用于最近截断的表。我已经用相同的信息更新了我的答案。
【解决方案2】:

不幸的是,api 没有(还没有?)提供端点来检查表的截断状态。

为了避免这个问题,可以通过 gc 存储使用加载作业。

看起来加载作业尊重此状态,因为我连续多次截断/加载没有问题。

public void load(String datasetName, String tableName, String sourceUri) throws InterruptedException {
    Table table = getTable(datasetName, tableName);

    Job job = table.load(FormatOptions.json(), sourceUri);
    // Wait for the job to complete

    Job completedJob = job.waitFor(RetryOption.initialRetryDelay(Duration.ofSeconds(1)),
            RetryOption.totalTimeout(Duration.ofMinutes(3)));
    if (completedJob != null && completedJob.getStatus().getError() == null) {
        // Job completed successfully
    } else {
        // Handle error case
    }
}

【讨论】:

    猜你喜欢
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多