Отклонить попытку загрузки данных в BigQuery для существующих данных - PullRequest
0 голосов
/ 14 апреля 2019

Я загружаю данные из фреймов pandas в BigQuery с помощью пакета pandas-gbq:

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 Ответ

4 голосов
/ 14 апреля 2019

Есть ли способ отклонить попытку загрузки, если ключ уже появился в таблице 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

Примечание. В этом случае дополнительные расходы не требуются, однако при извлечении из таблицы всегда нужно обязательно использовать функцию окна

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...