我通过执行此处描述的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分钟以上。
我想检查一下我的桌子是否仍处于";表被截断"周期性地直到这种状态消失。
我如何请求bigqueryapi来检查表是否准备好插入?
如何请求bigqueryapi来获取表的状态?
编辑
复制的例子可以在这里找到
如果在流媒体管道仍在运行或对最近截断的表执行流媒体插入时截断了表,您可能会收到一些问题中提到的错误(表被截断(,这是预期的行为。InsertAll(非常高的QPS API(的元数据一致性模式最终是一致的,这意味着当使用InsertAll API时,它可能会得到延迟的表元数据,并返回类似截断表的失败。解决此问题的典型方法是后退并重试。
目前,BigQuery API中没有选项来检查表是否处于截断状态。
遗憾的是,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
}
}