拒绝 BigQuery 对现有数据的数据加载尝试
Posted
技术标签:
【中文标题】拒绝 BigQuery 对现有数据的数据加载尝试【英文标题】:Reject data load attempt to BigQuery for existing data 【发布时间】:2019-04-14 09:05:29 【问题描述】:我正在使用 pandas-gbq 包将数据从 pandas 数据帧加载到 BigQuery:
df.to_gbq('dataset.table', project_id, reauth=False, if_exists='append')
典型的数据框如下所示:
key | value | order
"sd3e" | 0.3 | 1
"sd3e" | 0.2 | 2
"sd4r" | 0.1 | 1
"sd4r" | 0.5 | 2
如果密钥已经出现在 BigQuery 表中,有没有办法拒绝加载尝试?
【问题讨论】:
【参考方案1】:如果密钥已经出现在 BigQuery 表中,有没有办法拒绝加载尝试?
不,因为 BigQuery 不像其他数据库那样支持键。 有两个典型的用例可以解决这个问题:
选项 1: 上传带有时间戳的数据并使用合并命令删除重复项
请参阅link 了解如何执行此操作,这是一个示例
MERGE `DATA` AS target
USING `DATA` AS source
ON target.key = source.key
WHEN MATCHED AND target.ts < source.ts THEN
DELETE
注意:在这种情况下,您需要为合并扫描付费,但要保持表格行的唯一性。
选项 2:
上传带有时间戳的数据并使用ROW_NUMBER
窗口函数获取最新记录,这是您的数据示例:
WITH DATA AS (
SELECT 'sd3e' AS key, 0.3 as value, 1 as r_order, '2019-04-14 00:00:00' as ts UNION ALL
SELECT 'sd3e' AS key, 0.2 as value, 2 as r_order, '2019-04-14 01:00:00' as ts UNION ALL
SELECT 'sd4r' AS key, 0.1 as value, 1 as r_order, '2019-04-14 00:00:00' as ts UNION ALL
SELECT 'sd4r' AS key, 0.5 as value, 2 as r_order, '2019-04-14 01:00:00' as ts
)
SELECT *
FROM (
SELECT * ,ROW_NUMBER() OVER(PARTITION BY key order by ts DESC) rn
FROM `DATA`
)
WHERE rn = 1
这会产生如下预期结果:
注意:这种情况不会产生额外费用,但是,从表格中提取时,您始终必须确保使用窗口功能
【讨论】:
感谢您的快速回复!...我设法按照您的建议删除了重复项..虽然,由于我的问题的答案是“否”,我想我会使用 pandas duplicated( ) 方法代替..以上是关于拒绝 BigQuery 对现有数据的数据加载尝试的主要内容,如果未能解决你的问题,请参考以下文章
访问被拒绝:BigQuery BigQuery:写入数据时权限被拒绝
从 DataFlow 加载到现有 BigQuery 表时是不是可以更新架构?
尝试从 golang 广告读取/运行对 bigquery 的查询被拒绝访问:BigQuery BigQuery:未找到具有 Google Drive 范围的 OAuth 令牌