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表中,是否可以拒绝加载尝试?
如果键已出现在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)
注意:这种情况不会产生额外的费用,但是,从表中获取数据时,您始终必须确保使用窗口功能
| 归档时间: |
|
| 查看次数: |
208 次 |
| 最近记录: |