Есть ли способ отклонить попытку загрузки, если ключ уже появился в таблице BigQuery?
Нет, поскольку BigQuery не поддерживает ключи аналогично другим базам данных.
Есть 2 типичных варианта использования для решения этой проблемы:
Вариант 1:
Загрузите данные с меткой времени и используйте команду слияния для удаления дубликатов
См. ссылку о том, как это сделать. Это пример
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
Это дает ожидаемые результаты следующим образом:
![enter image description here](https://i.stack.imgur.com/WNugU.png)
Примечание. В этом случае дополнительные расходы не требуются, однако при извлечении из таблицы всегда нужно обязательно использовать функцию окна