【问题标题】:BigQuery Stream and Delete while streaming buffer is not empty?流缓冲区不为空时 BigQuery 流和删除?
【发布时间】:2018-06-28 02:56:24
【问题描述】:

BigQuery 不会直接流式传输到其长期存储中,它们首先将其放入写入优化的存储中,然后定期将其刷新到主存储中。

我想在以下用例中更好地了解 BigQuery Streaming 缓冲区。

1) 如果我删除 bigquery 表,并立即重新创建一个具有相同名称的新 bigquery 表,而某些记录仍留在流缓冲区中等待刷新到主存储中,该怎么办?

例如,如果我将一百万条记录流式传输到 BigQuery。一些记录现在仍保留在流缓冲区中,等待刷新到 BigQuery 的主存储。

此时我删除了 BigQuery 表并重新创建了同名的 BigQuery 表,流缓冲区中的剩余记录是否仍会刷新到重新创建的新表中?或者流缓冲区中的剩余记录将被丢弃?

我的猜测是流缓冲区中的剩余记录将被删除?我的猜测是,即使删除表并重新创建同名表,旧表和新表的“对象 id”也应该不同。

我说的对吗?

2) 如果我运行删除查询尝试删除我之前刚刚流式传输的一些记录怎么办?

同上,如果我流式传输 100 万条记录,其中一些仍留在流式传输缓冲区中,此时,我发出删除 sql 应该删除我刚刚流式传输的一些记录。

但是如果我要删除的记录在我发送 delete sql 命令时仍在流缓冲区中等待刷新到主存储中,那么我的删除 sql 将无法删除它们(它们不在 BigQuery 主存储中然而),然后,这些记录将被刷新到主存储中。这意味着我的删除 sql 将无法删除这些记录。

我说的对吗?如果我是正确的,那么为了让我的 delete sql 工作,我必须在发出 delete sql 之前找出流缓冲区是否为空?这会让事情变得更复杂。

谢谢!

【问题讨论】:

  • 这实在是太笼统了,太多的问题合而为一了。我建议阅读这篇很棒的博文:cloud.google.com/blog/big-data/2017/06/…
  • 谢谢格雷厄姆。我从下面的YY那里得到了答案。但是,如果有人有兴趣更深入地了解 Google BigQuery Streaming 的工作原理,那是一篇不错的文章。

标签: google-bigquery streaming


【解决方案1】:

1) 正确。 “object id”不同,剩余的记录将被删除。

2) 种类正确。 DML 语句不能修改仍在流缓冲区中的数据。但是,如果它试图触及仍在流缓冲区中的行,则该语句将失败。

【讨论】:

    【解决方案2】:

    我的经验。

    如果您不必使用“流式传输到 BigQuery”,请不要使用它。

    目前,大多数情况下我会将数据保存在 Google Cloud Storage 中,然后将数据从 Google Cloud Storage 传输到 BigQuery。

    例如,在旧案例中,我从 MySQL 抓取数据,并流式传输到 BigQuery。现在我会

    • 将数据从 MySQL 移动到 Cloud Storage
    • 然后将数据从 Cloud Storage 移动到 BigQuery

    这解决了我之前在使用“流式传输到 BigQuery”时遇到的很多问题。

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 2018-10-25
      • 2016-05-27
      • 2015-11-06
      • 1970-01-01
      • 2021-09-27
      相关资源
      最近更新 更多