除了覆盖表之外,还有其他方法可以更新 Big Query 中的行吗?

Posted

技术标签:

【中文标题】除了覆盖表之外,还有其他方法可以更新 Big Query 中的行吗?【英文标题】:Is there any other approach for updating a row in Big Query apart from overwriting the table? 【发布时间】:2016-05-01 18:21:58 【问题描述】:

我有一个包数据,其中一些字段如下:

packageid-->string
status--->string
status_type--->string
scans--->record(repeated)
     scanid--->string
     status--->string
scannedby--->string

每天,我有 100 000 个包裹的数据。每天的总包数据大小变为 100 MB(大约),1 个月变为 3GB。对于每个包,可以进行 3-4 次更新。那么每次包更新(例如,只是状态字段的更改)时,我是否必须覆盖包表?

假设我在表中有 3 个包的数据,现在第二个包的更新来了,我是否必须覆盖整个表(删除和添加整个数据需要 2 个事务每个包更新)?对于 100 000 个包裹,总交易量将为 10^5 * 10^5 * 2/2。

还有其他方法可以在不覆盖表的情况下进行原子更新吗? (如果表包含 100 万个条目,然后包更新来了,那么覆盖整个表将是一个开销。)

【问题讨论】:

您知道 BQ 在设计上是只能附加的吗?这会改变你的方法吗?您的数据不是基于事件的,例如更新实际上是一个新事件吗? 嗨,奔腾,我的数据是基于事件的。对于包 id 说。 1406540​​70001 我的状态为待处理,然后在下一次事件更新中,状态更改为完成。现在为此我有一个新行,具有相同的数据,只是一个字段更改。因此,每当对现有软件包进行任何更新时,我都会删除重复项。你是说我应该继续追加而不重复删除吗?这对我来说似乎也很好,但后来我的关注点转移到了数据存储上。会有很多冗余。 我们拥有相同的东西,并且我们保留实体生命周期的所有版本。存储成本低。还是对你来说很高? 【参考方案1】:

目前无法更新单个行。我们确实经常看到这个用例,我们推荐类似于米哈伊尔建议的东西。基本上,如果您有一个逻辑行的唯一 ID,以及行数据的更新时间的时间戳,您可以简单地将每个更新添加为新行,并在表上应用视图以提供所需的行。

您的视图将如下所示:

SELECT *
FROM (
  SELECT
      *,
      MAX(<timestamp_column>)
          OVER (PARTITION BY <id_column>)
          AS max_timestamp,
  FROM <table>
)
WHERE <timestamp_column> = max_timestamp

(抄自这里Return only the newest rows from a BigQuery table with a duplicate items)

如果你的表被分区成日常表(或者一段时间后变成静态的),你可以在表稳定后用视图查询的结果替换视图,提高查询效率。

例如

将数据添加到 TABLE_RAW。 创建对 TABLE_RAW 执行上述查询的视图 TABLE 在 TABLE_RAW 稳定后的某个时间点,使用目标表 TABLE 查询 TABLE,写入处置为 WRITE_TRUNCATE。

不幸的是,这确实增加了一些开销。也就是说,对于您的用例,您也许可以无限期地保留视图,这会简化一些事情。

【讨论】:

在这种情况下,什么会更高效?:您的答案中的查询,或者这个:gist.github.com/anonymous/76458c2f55a713c79466fc889e806579【参考方案2】:

您无法更新 BigQuery 表中的行。你只能添加一个 覆盖每笔交易的表格 - 从任何潜在客户来看都没有任何意义

我建议将每笔交易都添加为新行。

同时,如果出于任何原因(存储成本、查询成本、查询性能等)您想要进行重复数据删除 - 您可以定期进行批量重复数据删除 - 比如说每天。在这种情况下,将原始数据分区到日常表中将是有益的。在每个时刻,您只需要最新的重复数据表和最近的每日表来查询最新的交易。如果您担心存储成本,可以删除前几天的每日表

【讨论】:

以上是关于除了覆盖表之外,还有其他方法可以更新 Big Query 中的行吗?的主要内容,如果未能解决你的问题,请参考以下文章

除了缩略图方法之外,还有其他方法可以在 Iphone 中截取视频吗?

除了适配器之外,还有其他方法可以将数据实现到活动中吗?

Android:除了 Location.getAltitude() 之外,还有其他方法可以获取高度吗? (我听说过使用传感器)

除了通过 main 的 argv 之外,还有其他方法可以将用户参数传递给程序吗?

除了使用字符串文字之外,还有其他方法可以在 C 中指定或输入 Unicode 代码点吗?

除了 react-native-background-task 之外,还有其他方法可以在 React Native 中执行后台任务吗?