gpt4 book ai didi

google-bigquery - 使用流 API 更新新列后无法向 BigQuery 表插入新值

转载 作者:行者123 更新时间:2023-12-04 12:51:36 25 4
gpt4 key购买 nike

我的 bigquery 表出现了一些奇怪的行为,我刚刚创建了一个新列到表中,它在界面上看起来不错,并通过 api 获取架构。

但是当向新列添加值时,我收到以下错误:

{
"insertErrors" : [ {
"errors" : [ {
"message" : "no such field",
"reason" : "invalid"
} ],
"index" : 0
} ],
"kind" : "bigquery#tableDataInsertAllResponse"
}

我正在使用 java 客户端和流 API,我添加的唯一内容是:

tableRow.set("server_timestamp", 0)

没有那条线它可以正常工作:(

你看它有什么问题吗(列的名字是server_timestamp,它被定义为一个INTEGER)

最佳答案

更新此答案,因为 BigQuery 的流媒体系统自 2014 年 8 月最初回答此问题以来发生了重大更新。

BigQuery 的流系统最多可缓存表架构 2 分钟。当您将字段添加到架构然后立即将新行流式传输到表时,您可能会遇到此错误。

避免此错误的最佳方法是在修改表后将带有新字段的流行延迟 2 分钟。

如果这是不可能的,您还有其他一些选择:

  • 使用 ignoreUnknownValues选项。此标志将告诉插入操作忽略未知字段,并仅接受它识别的那些字段。设置此标志允许您立即开始使用新字段流式传输记录,同时避免在 2 分钟窗口期间出现“无此类字段”错误——但请注意,新字段值将被静默删除,直到缓存表模式更新!
  • 使用 skipInvalidRows选项。此标志将告诉插入操作插入尽可能多的行,而不是在检测到单个无效行时使整个操作失败。如果只有部分数据包含新字段,则此选项很有用,因为您可以继续使用旧格式插入行,并单独决定如何处理失败的行(使用 ignoreUnknownValues 或等待 2 分钟窗口经过)。

  • 如果您必须捕获所有值并且不能等待 2 分钟,您可以使用更新后的架构创建一个新表并流式传输到该表。这种方法的缺点是您需要管理由这种方法生成的多个表。请注意,您可以使用 TABLE_QUERY 方便地查询这些表。 ,并且您可以运行定期清理查询(或表副本)以将您的数据合并到一个表中。

    历史记录:此答案的先前版本建议用户停止流式传输,将现有数据移动到另一个表,重新创建流式传输表,然后重新启动流式传输。但是,由于这种方法的复杂性和架构缓存的缩短窗口,BigQuery 团队不再推荐这种方法。

    关于google-bigquery - 使用流 API 更新新列后无法向 BigQuery 表插入新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25279116/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com