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

Is there any other approach for updating a row in Big Query apart from overwriting the table?

我有一个包数据,其部分字段如下:

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

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

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

有没有其他方法可以在不覆盖 table 的情况下进行原子更新? (好像 table 包含 100 万个条目然后更新包,然后覆盖整个 table 将是一个开销。)

您无法在 BigQuery table 中更新行。你只能添加一个 在每笔交易中覆盖 table - 从任何预期

来看根本没有意义

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

同时,如果您出于任何原因(存储成本、查询成本、查询性能等)想要进行重复数据删除 - 您可以定期进行批量重复数据删除 - 比如说每天一次。在这种情况下,每天 tables 对原始数据进行分区将是有益的。在任何时候,您只需要最新的 Deduped Table 和最近的 Daily table 来查询最新的交易。如果担心存储成本

,前几天每天table可以删除

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

您的视图将如下所示:

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

(从这里抄袭

如果您的 table 被划分为每日 tables(或在一段时间后变为静态),您可以在 [=36= 之后用视图查询的结果替换视图] 稳定,提高查询效率

例如

  • 将数据添加到 TABLE_RAW。
  • 创建在 TABLE_RAW
  • 上执行上述查询的视图 TABLE
  • 在 TABLE_RAW 之后的某个时间点是 stable,查询 TABLE,目的地 table 为 TABLE,写入配置 WRITE_TRUNCATE.

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