尽管更新了架构,但 BigQuery 架构错误

Posted

技术标签:

【中文标题】尽管更新了架构,但 BigQuery 架构错误【英文标题】:BigQuery Schema error despite updating schema 【发布时间】:2013-12-16 15:31:51 【问题描述】:

我正在尝试同时运行多个作业,以便将大约 700K 记录加载到单个 BigQuery 表中。我的代码 (Java) 根据作业记录创建架构,并根据需要更新 BigQuery 架构。

工作流程如下:

    单个作业创建表并设置(初始)架构。 对于每个加载作业,我们都会根据作业记录创建架构。然后我们从 BigQuery 中提取现有的表架构,如果它不是与作业关联的架构的超集,我们将使用新的合并架构更新架构。最后一部分(从提取现有模式开始)被同步(使用锁) - 一次只有一个作业执行它。 schema 的更新是使用 UPDATE 方法,只有在客户端更新方法返回后才会释放锁。

我希望使用此工作流程避免遇到架构更新错误。我假设一旦客户端从更新作业返回,然后表就会更新,并且正在进行的作业不会因架构更新而受到伤害。

尽管如此,我仍然不时收到架构更新错误。更新方法是原子的吗?我如何知道架构何时实际更新?

【问题讨论】:

【参考方案1】:

BigQuery 中的更新是原子更新,但它们会在作业结束时应用。当作业完成时,它会确保模式是等效的。如果作业运行时有架构更新,则此检查将失败。

我们可能应该确保模式是兼容的而不是等效的。如果您使用应该成功的兼容架构(即您有一个表架构的子集)进行追加,但目前 BigQuery 不允许这样做。我会提交一个错误。

【讨论】:

对于不包含架构(仅数据)的加载作业,与此作业关联的架构是什么(在“确保架构等效”中将失败的架构)。请注意,在我的用例中,没有作业(除了创建表的作业)包含架构。所有架构更新都使用 UPDATE 表完成,所有加载作业都不包含架构。 作业开始时的模式在作业结束时被复制和验证。这是为了防止在加载作业运行时发生不兼容的模式更改(例如,使用截断表作业),然后让新数据提交并损坏表。这可能看起来像:1. 开始加载作业 2. 截断表并更改架构 3. 使用旧架构加载作业提交。

以上是关于尽管更新了架构,但 BigQuery 架构错误的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 表的架构与配方不匹配

Google BigQuery:错误:架构更新无效。字段已将模式从 REQUIRED 更改为 NULLABLE

BigQuery 加载作业的无架构解决方案

Bigquery:我们应该在模式更新后等待多长时间才能流式传输数据?

更新 bigquery 架构时出现异常

使用 Python API 使用 RECORD 字段更新 BigQuery 架构