Загрузка данных из красного смещения AWS с использованием python - PullRequest
0 голосов
/ 12 января 2019

Я столкнулся с миссией, которую невозможно извлечь из большого количества данных из Amazone Redshift в другую таблицу. Это определенно требует более эффективного подхода, но я новичок в SQL и AWS, поэтому решил обратиться к этому умному сообществу за советом.

Это мой первоначальный SQL-запрос, который занимает вечность:

-- STEP 1: CREATE A SAMPLE FOR ONE MONTH
SELECT DISTINCT at_id, utc_time, name
INTO my_new_table
FROM s3_db.table_x
WHERE type = 'create' 
AND (dt BETWEEN '20181001' AND '20181031');

Какой будет лучший подход? Я думал об использовании python и sqlalchemy для создания фреймов данных с кусками по 1 м строк и вставки их обратно в новую таблицу (которую мне нужно создать заранее). Будет ли это работать?:

from sqlalchemy import create_engine
import os
import pandas as pd

redshift_user = os.environ['REDSHIFT_USER']
redshift_password = os.environ['REDSHIFT_PASSWORD']

engine_string = "postgresql+psycopg2://%s:%s@%s:%d/%s" \
% (redshift_user, redshift_password, 'localhost', XXXX, 'redshiftdb')
engine = create_engine(engine_string)

for df in pd.read_sql_query("""
                        SELECT DISTINCT at_id, utc_time, name
                        INSERT INTO my_new_table
                        FROM s3_db.table_x
                        WHERE type = 'create' 
                        AND (dt BETWEEN '20181001' AND '20181031');
                       """, engine, chunksize=1000000):

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Теперь кажется, что ваши исходные данные хранятся в Amazon S3, и вы использовали таблицу Redshift Spectrum (которая указывает на данные в S3) в качестве источника.

Предпочтительным методом будет:

  • Используйте команду Amazon Redshift COPY для загрузки данных в таблицу Redshift
  • Используйте команду CREATE TABLE AS для извлечения (ETL) данных из новой таблицы Redshift в нужную таблицу. Если вы делаете это на регулярной основе, вы можете использовать TRUNCATE и INSERT INTO для перезагрузки таблицы в будущем.
0 голосов
/ 14 января 2019

Пожалуйста, ознакомьтесь с руководящими принципами AWS для лучших практик RedShift и Spectrum; Я поместил ссылки в конце этого поста. Исходя из вашего вопроса, я предполагаю, что вы хотите извлечь, преобразовать и загрузить огромное количество данных из таблицы RedShift Spectrum "s3_db.table_x" в новую таблицу RedShift "my_new_table"

Вот несколько предложений, основанных на рекомендациях AWS:

  1. Создайте таблицу RedShift с соответствующим ключом распределения, ключом сортировки и кодировкой сжатия. На высоком уровне «at_id» лучше всего подходит в качестве ключа раздела, а «utc_time» в качестве ключа сортировки для ваших требований, но обязательно ознакомьтесь с рекомендациями AWS для оформления таблицы RedShift 3 .

  2. Как вы упомянули, объем ваших данных огромен, вам может потребоваться разбить исходную таблицу S3 "s3_db.table_x" на основе столбцов "type" и "dt" (как это предлагается в точке № 4 в спектре лучшие практики 1 ).

  3. Заменить DISTINCT на GROUP BY в запросе на выборку из Spectrum (точка № 9 в Spectrum Best Practices 1 ).

  4. AWS рекомендует (пункт 7 в рекомендациях Spectrum 1 ) упростить процесс ETL с помощью операторов CREATE TABLE AS SELECT или SELECT INTO, в которых вы можете поместить логику преобразования в компоненте select загружать данные напрямую из S3 в RedShift.

лучшие практики использования спектра красного смещения

лучшие практики красного смещения

Таблица с дизайном красного смещения

0 голосов
/ 12 января 2019

Вы должны использовать CREATE TABLE AS .

Это позволяет указать оператор SELECT и сохранить результаты непосредственно в новой таблице.

Это чрезвычайно более эффективно, чем загрузка данных и повторная загрузка.

Вы также можете CREATE TABLE LIKE, а затем загрузить его с данными. См .: Выполнение глубокой копии

Вы также можете UNLOAD данные в Amazon S3, а затем загрузить их снова через COPY, но использование CREATE TABLE AS, безусловно, лучший вариант.

...