我有一些包含数据的包数据如下:
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个事务)?对于10万个包裹,总交易量为10 ^ 5 * 10 ^ 5 * 2/2。
在没有覆盖表的情况下,还有其他原子更新方法吗? (好像该表包含100万个条目然后包更新到来,然后覆盖整个表将是一个开销。)
答案 0 :(得分:7)
目前无法更新单个行。我们确实经常看到这个用例,我们推荐类似于Mikhail建议的东西。基本上,如果您有一个逻辑行的唯一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)
如果您的表被分区为每日表(或在一段时间后变为静态表),则可以在表稳定后用视图查询的结果替换视图,并提高查询效率。
e.g。
不幸的是,这确实增加了一些开销。也就是说,对于您的用例,您可以无限期地保留视图,这会简化一些事情。
答案 1 :(得分:2)
您无法更新BigQuery表中的行。你只能添加一个 覆盖每一笔交易的表格 - 从任何前瞻性的角度来看都没有意义
我建议将每个事务添加为新行。
同时,如果出于任何原因(存储成本,查询成本,查询性能等)您想要进行重复数据删除 - 您可以定期进行批量重复数据删除 - 让我们每天说。在这种情况下,在日常表中划分原始数据将是有益的。在每个时刻,您只需要最新的Deduped表和最近的Daily表来查询最新的交易。如果您担心存储成本,可以删除前几天的每日表