BigQuery - 删除重复记录有时需要很长时间
Posted
技术标签:
【中文标题】BigQuery - 删除重复记录有时需要很长时间【英文标题】:BigQuery - removing duplicate records sometimes taking long 【发布时间】:2017-04-11 07:34:44 【问题描述】:我们在 Cloud 中实现了以下 ETL 流程:每小时在本地数据库中运行一次查询 => 将结果保存为 csv 并将其加载到云存储中 => 将文件从云存储加载到 BigQuery 表中 => 使用删除重复记录以下查询。
SELECT
* EXCEPT (row_number)
FROM (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY timestamp DESC) row_number
FROM rawData.stock_movement
)
WHERE row_number = 1
从今天早上 8 点(柏林当地时间)开始,删除重复记录的过程比平时花费的时间要长得多,即使数据量也与往常没有太大区别:删除重复记录通常需要 10s而今天早上有时半小时。
是不是删除重复记录的性能不稳定?
【问题讨论】:
【参考方案1】:可能是您对特定id
有许多重复值,因此计算行号需要很长时间。如果您想检查是否是这种情况,您可以尝试:
#standardSQL
SELECT id, COUNT(*) AS id_count
FROM rawData.stock_movement
GROUP BY id
ORDER BY id_count DESC LIMIT 5;
话虽如此,使用此查询删除重复项可能会更快:
#standardSQL
SELECT latest_row.*
FROM (
SELECT ARRAY_AGG(t ORDER BY timestamp DESC LIMIT 1)[OFFSET(0)] AS latest_row
FROM rawData.stock_movement AS t
GROUP BY t.id
);
这是一个例子:
#standardSQL
WITH T AS (
SELECT 1 AS id, 'foo' AS x, TIMESTAMP '2017-04-01' AS timestamp UNION ALL
SELECT 2, 'bar', TIMESTAMP '2017-04-02' UNION ALL
SELECT 1, 'baz', TIMESTAMP '2017-04-03')
SELECT latest_row.*
FROM (
SELECT ARRAY_AGG(t ORDER BY timestamp DESC LIMIT 1)[OFFSET(0)] AS latest_row
FROM rawData.stock_movement AS t
GROUP BY t.id
);
这可能更快的原因是 BigQuery 只会在任何给定时间点将具有最大时间戳的行保留在内存中。
【讨论】:
以上是关于BigQuery - 删除重复记录有时需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章