Способ экспорта таблицы (или запроса) psql напрямую в AWS S3 в виде файла (csv, json) - PullRequest
0 голосов
/ 04 июля 2018

В этом ответе предлагается использовать AWS Data Pipeline , но мне интересно, есть ли умный способ сделать это с моей собственной машиной и Python.

Я использую библиотеки psycopg2 , boto3 и pandas . Таблицы имеют от 5 до 50 столбцов и несколько миллионов строк. Мой текущий метод не очень хорошо работает с большими данными.

Ответы [ 2 ]

0 голосов
/ 30 июля 2018

Полагаю, я могу также показать здесь одну из своих версий, основанную на copy_expert в psycopg2

import io
import psycopg2
import boto3

resource = boto3.resource('s3')
conn = psycopg2.connect(dbname=db, user=user, password=pw, host=host)
cur = conn.cursor()

def copyFun(bucket, select_query, filename):
    query = f"""COPY {select_query} TO STDIN \
            WITH (FORMAT csv, DELIMITER ',', QUOTE '"', HEADER TRUE)"""
    file = io.StringIO()
    cur.copy_expert(query, file)
    resource.Object(bucket, f'{filename}.csv').put(Body=file.getvalue())
0 голосов
/ 05 июля 2018

В нашем случае мы следуем, исходя из производительности, довольно быстрого и запланированного метода, а не непрерывной потоковой передачи. Я не уверен на 100%, если это мудрый метод, но определенно хорош с точки зрения скорости в случае запланированного экспорта данных в формате CSV, который мы в конечном итоге используем для загрузки в d/w.

  • Используя сценарий оболочки, мы запускаем команду psql для copy данных в локальный файл в приложении EC2.

    psql [your connection options go here] -F, -A -c 'select * from my_schema.example' >example.csv

  • Затем, используя сценарий оболочки, мы запускаем команду s3cmd для Put example.csv для обозначенного S3:bucket Location.

    s3cmd put example.csv s3://your-bucket/path/to/file/

...