Перенос csv из gcs в postgresql - PullRequest
       6

Перенос csv из gcs в postgresql

0 голосов
/ 03 октября 2018

Я пытаюсь перенести csv-файлы из Google Cloud Storage (GCS), которые были экспортированы из BigQuery, в экземпляр SQL-облака PostgreSQL Google с использованием скрипта python.

Я надеялся использоватьGoogle API, но обнаружил это в документации :

Импорт данных CSV с использованием API-интерфейса Cloud SQL Admin не поддерживается для экземпляров PostgreSQL.

AsВ качестве альтернативы я мог бы использовать библиотеку psycopg2 и передавать строки файла csv в экземпляр SQL.Я могу сделать это тремя способами

  • Строка за строкой: прочитать каждую строку, затем отправить команду вставки и затем зафиксировать
  • Пакетный поток: прочитать каждую строку, а затем отправить команды вставки изатем зафиксируйте после 10 строк или 100 и т. д.
  • Весь csv: прочитайте каждую строку и отправьте команды вставки, а затем зафиксируйте только в конце документа.

Мои опасенияэти CSV-файлы могут содержать миллионы строк, и выполнение этого процесса для любого из трех упомянутых выше вариантов представляется мне плохой идеей.

Какие альтернативы у меня есть?По сути, у меня есть некоторые необработанные данные в BigQuery, по которым мы выполняем некоторую предварительную обработку перед экспортом в GCS для подготовки к импорту в экземпляр PostgreSQL.Мне нужно экспортировать эти предварительно обработанные данные из BigQuery в экземпляр PostgreSQL.

Это не дубликат этого вопроса , так как я предпочтительно ищу решение, которое экспортирует данные из BigQuery вЭкземпляр PostgreSQL, будь то через GCS или напрямую.

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Я обнаружил, что в модуле pyscopg2 есть функция copy_from (), которая позволяет загружать весь CSV-файл вместо индивидуальной потоковой передачи строк.Недостатком использования этого метода является то, что файл CSV по-прежнему необходимо загружать из GCS и хранить локально.

Вот подробности использования pyscopg2 'copy_from ()'.(С здесь )

import psycopg2

conn = psycopg2.connect("host=localhost dbname=postgres user=postgres")
cur = conn.cursor()
with open('user_accounts.csv', 'r') as f:
    # Notice that we don't need the `csv` module.
    next(f)  # Skip the header row.
    cur.copy_from(f, 'users', sep=',')

conn.commit()
0 голосов
/ 03 октября 2018

Вы можете просто использовать класс, чтобы текст, который вы извлекаете из Интернета, вел себя как файл.Я использовал это несколько раз.

import io
import sys


class IteratorFile(io.TextIOBase):
    """ given an iterator which yields strings,
    return a file like object for reading those strings """

    def __init__(self, obj):
        elements = "{}|" * len(obj[0])
        elements = (unicode(elements[:-1]).format(*x) for x in obj)
        self._it = elements
        self._f = io.cStringIO()

    def read(self, length=sys.maxsize):

        try:
            while self._f.tell() < length:
                self._f.write(next(self._it) + "\n")

        except StopIteration as e:
            # soak up StopIteration. this block is not necessary because
            # of finally, but just to be explicit
            pass

        except Exception as e:
            print("uncaught exception: {}".format(e))

        finally:
            self._f.seek(0)
            data = self._f.read(length)

            # save the remainder for next read
            remainder = self._f.read()
            self._f.seek(0)
            self._f.truncate(0)
            self._f.write(remainder)
            return data

    def readline(self):
        return next(self._it)
0 голосов
/ 03 октября 2018

Вы можете выполнить процесс импорта с Облачным потоком данных , как предложено @GrahamPolley.Это правда, что это решение требует дополнительной работы (знакомство с Dataflow, настройка всего и т. Д.).Даже с дополнительной работой, это было бы предпочтительным решением для вашей ситуации.Однако есть и другие решения, и я объясню одно из них ниже.

Чтобы настроить процесс миграции с помощью Dataflow, это руководство о экспорте BigQuery в Google Datastore являетсяхороший пример


Альтернативное решение для облачного потока данных

Облачный SQL для PostgreSQL не поддерживает импорт из .CSV, но поддерживает .SQL файлов.

Тип файла для указанного uri.
SQL: файл содержит операторы SQL.
CSV: файл содержит данные CSV.Импорт данных CSV с использованием API-интерфейса Cloud SQL Admin не поддерживается для экземпляров PostgreSQL.

Прямым решением будет преобразование файла .CSV в .SQL с помощью какого-либо инструмента (Google не предоставляеттот, который я знаю, но есть много онлайн), а затем импортировать в PostgreSQL.

Если вы хотите реализовать это решение более «программным» способом, я бы предложил использовать Облачные функции, вот пример того, как я бы попытался это сделать:

  1. Настройка облачной функции, которая запускается при загрузке файла в корзину облачного хранилища
  2. Код функции, чтобы получить загруженный файл и проверить, является ли это .CSV.Если это так, используйте API csv-to-sql ( пример API здесь ), чтобы преобразовать файл в .SQL
  3. Сохраните новый файл в облачном хранилище
  4. Импорт в PostgreSQL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...