Python 3.x 使用python从AWS红移加载数据

Python 3.x 使用python从AWS红移加载数据,python-3.x,pandas,sqlalchemy,amazon-redshift,Python 3.x,Pandas,Sqlalchemy,Amazon 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 '

我面临的任务是无法从一个表中提取大量数据到另一个表中。这当然需要一种更有效的方法,但我对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创建具有1m行块的数据帧,并将其插入到新表中(我需要事先创建)。这行吗

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):
你应该使用

这允许您指定
SELECT
语句,并将结果直接存储到新表中

这比下载数据并重新上传要高效得多

您还可以创建类似于的表,然后用数据加载它。见:

您也可以
数据卸载到Amazon S3,然后通过
复制
再次加载,但使用
创建表作为
无疑是最好的选择。

您应该使用

这允许您指定
SELECT
语句,并将结果直接存储到新表中

这比下载数据并重新上传要高效得多

您还可以创建类似于的表,然后用数据加载它。见:


您也可以
卸载
数据到Amazon S3,然后通过
复制
再次加载,但使用
创建表作为
无疑是最好的选择。

现在看来,您的源数据存储在Amazon S3中,并且您一直使用红移光谱表(指向S3中的数据)作为源

首选的方法是:

  • 使用Amazon Redshift
    COPY
    命令将数据加载到Redshift表中
  • 使用
    CREATE TABLE AS
    命令将数据从新的红移表提取(ETL)到所需的表中。如果定期执行此操作,则可以使用
    TRUNCATE
    INSERT-INTO
    在将来重新加载表

现在看来,您的源数据存储在Amazon S3中,并且您一直使用红移光谱表(指向S3中的数据)作为源

首选的方法是:

  • 使用Amazon Redshift
    COPY
    命令将数据加载到Redshift表中
  • 使用
    CREATE TABLE AS
    命令将数据从新的红移表提取(ETL)到所需的表中。如果定期执行此操作,则可以使用
    TRUNCATE
    INSERT-INTO
    在将来重新加载表

有关红移和频谱最佳实践,请参考AWS指南;我把这些链接放在这篇文章的末尾。基于您的问题,我假设您希望从基于红移光谱的表“s3_db.table_x”提取、转换和加载大量数据到新的红移表“my_new_table”

以下是基于AWS建议的一些建议:

  • 使用适当的分发键、排序键和压缩编码创建红移表。在高层,“At_id”似乎最适合作为分区键,而“utc_time”最适合作为排序键,以满足您的需求,但请确保参考AWS指南进行红移表设计

  • 正如您提到的,您的数据量很大,您可能希望根据“type”和“dt”列对S3源表“S3_db.table_x”进行分区(如spectrum最佳实践中第4点所建议的)

  • 在从频谱选择查询(频谱最佳实践中的第9点)中,将
    DISTINCT
    替换为
    groupby

  • AWS建议(Spectrum最佳实践中的第7点)使用
    CREATE TABLE AS SELECT
    SELECT to
    语句简化ETL过程,其中您可以将转换逻辑放在SELECT组件中,直接将数据从S3加载到红移


  • 请参考AWS指南了解红移和频谱最佳实践;我把这些链接放在这篇文章的末尾。基于您的问题,我假设您希望从基于红移光谱的表“s3_db.table_x”提取、转换和加载大量数据到新的红移表“my_new_table”

    以下是基于AWS建议的一些建议:

  • 使用适当的分发键、排序键和压缩编码创建红移表。在高层,“At_id”似乎最适合作为分区键,而“utc_time”最适合作为排序键,以满足您的需求,但请确保参考AWS指南进行红移表设计

  • 正如您提到的,您的数据量很大,您可能希望根据“type”和“dt”列对S3源表“S3_db.table_x”进行分区(如spectrum最佳实践中第4点所建议的)

  • 在从频谱选择查询(频谱最佳实践中的第9点)中,将
    DISTINCT
    替换为
    groupby

  • AWS建议(Spectrum最佳实践中的第7点)使用
    CREATE TABLE AS SELECT
    SELECT to
    语句简化ETL过程,其中您可以将转换逻辑放在SELECT组件中,直接将数据从S3加载到红移


  • 您正在将数据从一个红移表移动到另一个红移表?是的,这是正确的。数据库操作最终会比先运行pandas,然后再返回红移更快,问题是现在需要很长时间?确切地说-几乎不可能完成,因为我一次又一次地遇到断管和松动的所有内容。有没有一种方法可以在SQL中分块执行?您需要更详细地了解源表的结构。它是一个实际的红移表,还是像“s3_db”这个名字所暗示的那样,它是一个频谱表?如果是后者,数据可能作为文件存在于S3中,而不是红移本身,并且您可以潜在地使用ot