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万个条目,然后包更新到来,然后覆盖整个表将是一个开销.)
目前无法更新单个行.我们确实经常看到这个用例,我们推荐类似于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表中包含重复项的最新行)
如果您的表被分区为每日表(或在一段时间后变为静态),则可以在表稳定后将视图替换为视图查询的结果,并提高查询效率.
例如
不幸的是,这确实增加了一些开销.也就是说,对于您的用例,您可以无限期地保留视图,这会简化一些事情.
归档时间: |
|
查看次数: |
1554 次 |
最近记录: |