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

hmi*_*ims 5 overwrite sql-update google-bigquery

我有一些包含数据的包数据如下:

packageid-->string
status--->string
status_type--->string
scans--->record(repeated)
     scanid--->string
     status--->string
scannedby--->string
Run Code Online (Sandbox Code Playgroud)

每天,我有10万包的数据.每天的总包数据大小变为100 MB(大约),1个月后变为3GB.对于每个包,可以进行3-4次更新.因此,每次更新软件包(例如,仅更改状态字段)时,我是否必须覆盖软件包表?

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

在没有覆盖表的情况下,还有其他原子更新方法吗?(好像该表包含100万个条目,然后包更新到来,然后覆盖整个表将是一个开销.)

Sea*_*hen 7

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

您的视图看起来像这样:

SELECT *
FROM (
  SELECT
      *,
      MAX(<timestamp_column>)
          OVER (PARTITION BY <id_column>)
          AS max_timestamp,
  FROM <table>
)
WHERE <timestamp_column> = max_timestamp
Run Code Online (Sandbox Code Playgroud)

(来自此处的cribbed 仅返回BigQuery表中包含重复项的最新行)

如果您的表被分区为每日表(或在一段时间后变为静态),则可以在表稳定后将视图替换为视图查询的结果,并提高查询效率.

例如

  • 将数据添加到TABLE_RAW.
  • 创建视图TABLE,通过TABLE_RAW执行上述查询
  • 在TABLE_RAW稳定后的某个时刻,查询TABLE,目标表为TABLE,写处理为WRITE_TRUNCATE.

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