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

2024-02-24

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

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

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

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

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


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

你的视图看起来像这样:

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

(从这里抄来的仅返回 BigQuery 表中包含重复项目的最新行 https://stackoverflow.com/questions/34165094/return-only-the-newest-rows-from-a-bigquery-table-with-a-duplicate-items)

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

e.g.

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐