Пакетная вставка только уникальных записей в PostgreSQL с Python (миллионы записей в день) - PullRequest
1 голос
/ 10 июля 2020

У меня более 10 млн записей в день для вставки в базу данных Postgres.

90% дублируются, и должны быть вставлены только уникальные записи (это можно проверить по указанному значению столбца c) .

Из-за большого объема пакетные вставки кажутся единственно разумным вариантом.

Я пытаюсь понять, как это работает.

Я пробовал:

  1. SQLAlchemy, но выдает ошибку. Так что я предполагаю, что это невозможно.
s = Session(bind=engine)
s.bulk_insert_mappings(Model, rows)
s.commit()

Броски:

IntegrityError: (psycopg2.errors.UniqueViolation) duplicate key value violates unique constraint "..._key"
Panda to_sql не имеет этой уникальной возможности записи.

Итак, я думаю о помещении новых записей в «промежуточную таблицу», а затем параллельном выполнении фоновых заданий, чтобы добавить эти записи в основную таблицу, если они еще не существуют. Не знаю, самая ли это эффективная процедура.

Есть ли лучший подход? Есть ли способ заставить SQLAlchemy или Pandas делать это?

1 Ответ

2 голосов
/ 10 июля 2020

Есть два распространенных способа go решения этой проблемы. Чтобы выбрать между ними, вам нужно изучить, на что вы готовы потратить вычислительную мощность, и будет ли дополнительная передача по сети проблемой. У нас недостаточно информации, чтобы сделать это за вас.

Вариант 1: Загрузить во временную таблицу

Этот вариант в основном соответствует тому, что вы описали. Имейте временную таблицу или таблицу, предназначенную для нагрузки, которая соответствует схеме вашей целевой таблицы. Очевидно, это должно исключить уникальные ограничения.

Загрузите весь пакет в эту таблицу, и как только все это будет вставлено из этой таблицы в целевую таблицу. Вы можете очень легко использовать стандартные операторы SQL для выполнения любых необходимых вам манипуляций, таких как distinct, будь то первая запись или что-то еще.

Вариант 2: Загружать только уникальные значения, фильтрация с помощью pandas

Pandas имеет функцию drop_duplicates(), которая ограничивает ваш фрейм данных уникальными записями, и вы можете указать такие вещи, как столбцы для проверки и какую строку оставить.

df = df.drop_duplicates(subset = ["Age"])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...