2016-02-16 3 views
1

Есть ли способ загрузить мои .gz-файлы, которые у меня есть на удаленном сервере, в таблицу базы данных красного смещения (postgresql), не загружая ее сначала в ведро s3?Загрузка данных из .gz-файла с удаленного сервера в postgresql-экземпляр красного смещения без использования ведра S3?

Я видел два варианта: -

  1. "copy <tablename> from program "gzip -d <file location in remote server> with delimeter tab '\t' " команду после подключения к базе данных. Это дало мне ошибку «синтаксическая ошибка в программе или рядом с ней».

  2. Не удалось найти выход из библиотеки psycopg2 в python. Вот код, написанный для python.

    import psycopg2 
    import gzip 
    conn_string="dbname='<>' port='5439' user='<>' password='<>' host='<>'"; 
    print "Connecting to database\n   ->%s"%(conn_string) 
    conn=psycopg2.connect(conn_string); 
    cursor=conn.cursor(); 
    with gzip.open('<gzip filelocation>','r') as l: 
        for line in l: 
        cursor.execute('copy <table_name from %s with delimiter '\t'", (line,)) 
    

Спасибо.

ответ

-1

Вы можете использовать команду "Вставить". Вы можете прочитать каждую строку из файла gzip и вставить ее в свою таблицу. Таким образом, вам не нужен ведро S3, потому что вы не используете команду «COPY». Например:

with gzip.open('<gzipfile>','r') as l: 
for line in l: 
    b=line.split('\t') # tab delimited 
    # Handling null values 
    for k in range(len(b)): 
     if b[k]=='\N': 
      b[k]=None 
    b=tuple(b) 
    sql= "INSERT INTO"+ " " + <tablename> + " VALUES (" + ",".join(["?"]*(len(b))) + ")" 
    cursor.execute(sql,b) 
+0

Это очень плохо ** идея для Redshift. Вы сможете загружать только ~ 100 строк в секунду * в лучшем случае *. Если это достаточно быстро для вас, вы, вероятно, не должны использовать Redshift. Как минимум, перед отправкой необходимо создать очень большие инструкции «INSERT ... VALUES». http://docs.aws.amazon.com/redshift/latest/dg/c_best-practices-multi-row-inserts.html –

+0

Это правда. Это будет медленный, но только способ избежать S3 (потому что у вас нет доступа). Есть ли способ оптимизировать инструкции insert? или «КОПИЯ» - лучший способ пойти? –

+0

Вы можете немного оптимизировать вставки, объединив много линий «VALUES». 'INSERT INTO (b, c) ЗНАЧЕНИЯ (1,2), (3,4), (5,6), ...;' –

0

Вы можете COPY непосредственно с удаленного хоста с использованием SSH. В практических целях это означает, что удаленный хост должен быть машиной * nix, а не Windows.

Вам все равно необходимо использовать S3, чтобы сохранить файл манифеста, который указывает детали соединения и команду для запуска, например, команду gzip выше.

Docs здесь: COPY from Remote Host (SSH)

Смежные вопросы