拒绝 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:写入数据时权限被拒绝

无法将数据插入现有 BigQuery 表?

从 DataFlow 加载到现有 BigQuery 表时是不是可以更新架构?

尝试从 golang 广告读取/运行对 bigquery 的查询被拒绝访问:BigQuery BigQuery:未找到具有 Google Drive 范围的 OAuth 令牌

如何使用 bigquery 流向现有记录插入嵌套数据

使用 R 连接到 BigQuery 时不断收到拒绝访问