拒绝尝试将数据加载到BigQuery以获取现有数据

Mat*_*alZ 0 python-3.x pandas google-bigquery

我正在使用pandas-gbq包将数据从熊猫数据帧加载到BigQuery:

df.to_gbq('dataset.table', project_id, reauth=False, if_exists='append')
Run Code Online (Sandbox Code Playgroud)

典型的数据框如下所示:

key      |    value    |    order
"sd3e"   |     0.3     |    1
"sd3e"   |     0.2     |    2
"sd4r"   |     0.1     |    1
"sd4r"   |     0.5     |    2
Run Code Online (Sandbox Code Playgroud)

如果键已经出现在BigQuery表中,是否可以拒绝加载尝试?

Tam*_*ein 5

如果键已出现在BigQuery表中,是否可以拒绝加载尝试?

不可以,因为BigQuery不像其他数据库那样支持键。有两种典型的用例可以解决此问题:

选项1:
使用timeStamp上传数据,然后使用merge命令删除重复项

有关此操作的信息,请参见此链接,这是一个示例

MERGE `DATA` AS target
USING `DATA` AS source
ON target.key = source.key
WHEN MATCHED AND target.ts < source.ts THEN 
DELETE
Run Code Online (Sandbox Code Playgroud)

注意:在这种情况下,您需要为合并扫描付费,但保持表行唯一。

选项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
Run Code Online (Sandbox Code Playgroud)

这将产生预期结果,如下所示: 在此处输入图片说明

注意:这种情况不会产生额外的费用,但是,从表中获取数据时,您始终必须确保使用窗口功能