代码之家  ›  专栏  ›  技术社区  ›  searain

Google BigQuery流式处理有时失败,如果我在流式处理之前先删除表并创建表

  •  3
  • searain  · 技术社区  · 7 年前

    • 删除旧表
    • 使用相同的名称和架构创建新表

    我以前做过好几次,效果很好。但最近我开始看到上面的方法不起作用。

    流式处理完成后(没有错误报告),我查询表,有时它可以工作。有时候,我有空桌子。(同一个脚本,同一个数据,运行多次,结果不一样。有时有效,有时无效。)

    更让人不解的是,当我传输大量数据时,大多数时候它似乎都在工作。但当我传输少量数据时,大多数时候都失败了。

    但如果我这样做

    • 创建新表

    它总是有效的。

    我在Google Apps Scrip和PHP Google Cloud Client Library for BigQuery中都尝试过。我也有同样的问题。

    • 删除旧表
    • 睡眠10秒,因此应该完成删除作业
    • 使用相同的名称和架构创建新表
    • 睡眠10秒,因此创建作业应该完成

    它仍然给我同样的问题。

    其他信息:

    我又试了一次。

    但是如果我在上一次运行之后运行脚本,那么结果是空的。数据不会流入新表。

    所以当流缓冲区不为空时,当我“删除旧表并创建新表”时似乎会发生错误。

    但根据这条线索的答案, BigQuery Stream and Delete while streaming buffer is not empty? ,

    另一方面,如果我尝试“截断旧表”,而不是“删除旧表并创建新表”,而流缓冲区中可能仍有数据,则“DML语句无法修改流缓冲区中的数据”,因此“截断旧表”将失败。

    简单地说,在这个用例中,

    • 我不能截断旧表,因为蒸汽缓冲区可能不是空的。
    • 我应该“删除旧表并创建新表,然后将数据流到新表”。但这似乎是我当前问题的根源,我的新数据无法流式传输到新表(即使新表具有新的对象id,也不应受到我只是删除旧表的影响)
    1 回复  |  直到 7 年前
        1
  •  2
  •   Felipe Hoffa    7 年前

    避免在流式处理时截断和重新创建表。

    官方文件:

    https://cloud.google.com/bigquery/troubleshooting-errors#streaming

    表创建/删除-流式处理到不存在的表将返回notFound响应的变体。后续的流插入可能无法立即识别为响应创建表。类似地,删除和/或重新创建表可能会创建一段时间,在这段时间内,流式插入将有效地传递到旧表,而不会出现在新创建的表中。

    表截断-截断表的数据(例如,通过使用writeDisposition of WRITE-TRUNCATE的查询作业)同样可能导致删除一致性期间的后续插入。

    为了避免丢失数据:用不同的名称创建一个新表。

        2
  •  0
  •   searain    5 年前

    我在我的另一个帖子中发布了关于流到BigQuery的信息。一般来说,如果可以的话,我会尽量避免流媒体。

    • 然后将数据从云存储加载到BigQuery

    这将解决许多与流相关的问题。