当流缓冲区不为空时,BigQuery Stream和Delete?

时间:2018-01-18 22:34:56

标签: google-bigquery streaming

BigQuery不会直接流入他们的长期存储,他们首先将其放入写入优化的商店并定期将其刷新到主存储。

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

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

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

此时,我删除BigQuery表并重新创建具有相同名称的BigQuery表,是否仍将流式缓冲区中的剩余记录刷新到新重建的表中?或者流媒体缓冲区中的剩余记录将被删除?

我的猜测是,流媒体缓冲区中的剩余记录会被删除吗?我的猜测是即使删除表并重新创建一个具有相同名称的表,旧表和新表的“对象ID”应该是不同的。

我说错了吗?

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

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:3)

1)正确。 “对象ID”不同,剩余的记录将被删除。

2)种类正确。 DML语句无法修改仍在流缓冲区中的数据。但是,如果该语句尝试触摸仍在流缓冲区中的行,则该语句将失败。

答案 1 :(得分:1)

我的经验。

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

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

就像在旧情况下一样,我从MySQL抓取数据,并流到BigQuery中。现在我会

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

这解决了我在使用“流到BigQuery”中遇到的很多问题。