Я пытаюсь сбросить кучу кадров данных панд в кластер красных смещений. Я могу заставить его работать, создав механизм соединения с sql_alchemy и используя df.to_sql(connection, yada, yada)
. Тем не менее, он очень медленный, поэтому я хотел переключиться на методологию массовой вставки, потому что для задачи важно время. Я нашел методологию, которая, кажется, должна работать, но я получаю ошибку. Код выглядит так:
output = io.StringIO()
df.to_csv(output, sep=sep, header=False, encoding=encoding)
output.seek(0)
# Insert data
connection = engine.raw_connection()
cursor = connection.cursor()
cursor.copy_from(output, table_name, sep=sep, null='')
connection.commit()
cursor.close()
Мне кажется, это должно сработать. Я генерирую объект stringio для хранения фрейма данных в потоке, а затем перехожу на copy_from, который не должен заботиться о том, является ли входной объект объектом stringio или открытым (file_name, 'r') объектом. Однако я получаю эту ошибку:
ProgrammingError: syntax error at or near "stdin"
LINE 1: COPY analytics.customer_data FROM stdin WITH DELIMITER AS ' ' NULL A...
Таблица находится в схеме «аналитика» и называется «customer_data». Я предполагаю, что stdin
означает, что я неправильно передаю StringIO, но я понятия не имею, почему. Я также могу сделать эту работу, создав дамп на жесткий диск CSV и запустив copy_from, но объем моей памяти ограничен, так как этот процесс вращается в крошечном док-контейнере, поэтому накладные расходы на хранение этих файлов на жестком диске становятся раздражающими. Я бы лучше свалил из StringIO.